上一节我们简要介绍了 InnoDB 及其基本的配置参数,本文要讲述的是性能调优的一些参数配置以及安全,备份恢复等。MySQL 要进入企业级的运作,对于一个 DBA 而言,这些是必备的知识。因此,本文将详细叙述性能调优方面的知识。
性能优化的一些主要参数:
set-variable = max_connections=200
set-variable = record_buffer=1M
set-variable = sort_buffer=1M
# 如果为 MyISAM 表的话,设置 key_buffer 为内存的 5 - 50 % ,
# 但是对于 InnoDB 来说,必须保证 key_buffer+ InnoDB 缓冲池小于内存的 80%。
set-variable = key_buffer=...
另外值得注意的几个参数是:
innodb_file_io_threads 文件 i/o 的线程数,一般为 4,但是在 Windows 下,可以设置得较大。
innodb_fast_shutdown InnoDB 缺省在关闭之前清理缓冲,这个过程可能需要几分钟,在极端的情况下可能需要几个小时,如果这个参数设置为 1 的话,InnoDB 就略过这个过程,从 3.23.50 开始这个参数的缺省值为 1 。
innodb_thread_concurrency InnoDB 努力把操作系统线程保留下来,缺省的值是 8,如果你的性能比较低, innodb_monitor 显示很多线程等待信号,应该把这个值设置得小一些,如果你的系统有很多处理器和磁盘则可以调高这个值。建议的值为 处理器数目加上磁盘数。
配置好 my.cnf 或者 my.ini 的参数之后,就可以启动 MySQL 建立 InnoDB 了,第一次建立之前,建议你手工启动,这样你就可以看到 InnoDB 的建立过程:
heikki@donna:~/mysql-3.23.48/sql> mysqld
020204 23:17:12 InnoDB: The first specified data file /dr2/tmp/heikki/data/ibdata1
did not exist:
InnoDB: a new database to be created!
InnoDB: Setting file /dr2/tmp/heikki/data/ibdata1 size to 20 MB
InnoDB: Database physically writes the file full: wait...
020204 23:17:16 InnoDB: Data file /dr2/tmp/heikki/data/ibdata2 did not exist: new
to be created
InnoDB: Setting file /dr2/tmp/heikki/data/ibdata2 size to 200 MB
InnoDB: Database physically writes the file full: wait...
020204 23:17:41 InnoDB: Data file /dr2/tmp/heikki/data/ibdata3 did not exist: new
to be created
InnoDB: Setting file /dr2/tmp/heikki/data/ibdata3 size to 1000 MB
InnoDB: Database physically writes the file full: wait...
020204 23:21:37 InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 10 MB
InnoDB: Database physically writes the file full: wait...
020204 23:21:39 InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
020204 23:21:41 InnoDB: Log file ./ib_logfile2 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile2 size to 10 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
020204 23:21:45 InnoDB: Started
mysqld: ready for connections
如果采用 mysqladmin shutdown 命令关闭时,显示:
020204 23:34:45 mysqld: Normal shutdown
020204 23:34:45 InnoDB: Starting shutdown...
020204 23:34:47 InnoDB: Shutdown completed
020204 23:34:47 mysqld: Shutdown Complete
进入日志文件所在的目录,我们可以看到 ib_arch_log_0000000000 这样的文件。
下面我们来建立一个 InnoDB 表,假设我们用 mysql test 进入:
CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) TYPE = InnoDB;
查看状态:
SHOW TABLE STATUS FROM test LIKE 'CUSTOMER'
需要注意的是,不要手工删除 InnoDB 数据库目录下的 .frm 文件,而是采用 create table 和 drop table 的方法。
把 MyISAM 转化为 InnoDB
*注意* MySQL 的系统表, user 或者 host 等不能转化为 InnoDB 格式,他们必须采用 MyISAM 格式!!
如果你想以后建立的所有表都为 InnoDB 格式,在配置文件中加入:
default-table-type=innodb
InnoDB 没有一个特殊的索引建立优化机制,因此不能采取 export/import ,然后建立索引的办法来转化,最快的办法是把表类型改变为 InnoDB ,然后直接插入数据:
ALTER TABLE ... TYPE=INNODB 或者建立一个空的具有同样结构的 InnoDB 表,然后插入数据:
INSERT INTO ... SELECT * FROM ....
为了更好的控制数据插入进程,最好把很大的表分批插入:
INSERT INTO newtable SELECT * FROM oldtable WHERE yourkey > something
AND yourkey <= somethingelse;
等数据全部插入完毕后,可以重新命名表名。
在插入过程中,要把 InnoDB 缓冲池设置得大点,以减少磁盘 I/O。同时还应该把日志文件和日志缓冲加大。
需要注意的是,不要让表空间用尽,如果 ALTER TABLE 用完了表空间,将会回滚,如果磁盘不够的话,这个过程会持续几个小时。
外键约束
从 MySQL 3.23.43b 开始, InnoDB 就支持外键约束,作为数据引用完整性的重要特色,InnoDB 在外键支持上开创了 MySQL 各种表类型的先河。
建立外键的方法:
例子:
CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)) TYPE=INNODB;
两表都必须为 InnoDB 类型,外键和被引用的键,必须是索引中的一个列,InnoDB 不会自动为外键建立索引,必须明确指明。
如果 CREATE TABLE 语句发生 1005 号错误,错误信息字符串引用 150 号错误,那么就是外键约束起了作用。
只有在父行中包含 NULL 的列,才允许在子行中包含 NULL。
目 前任何 ALTER TABLE 操作都会删除外键约束,因此,建议采用 DROP TABLE 然后 CREATE TABLE 来修改 schema。因为 ALTER TABLE 在内部使用 RENAME TABLE 操作,这样就能混淆外键的引用,同样的 CREATE INDEX 也是作为 ALTER TABLE 来处理的,也不能用于外键约束的表。
InnoDB 允许你 drop 任何表,即使这样会打破外键,这样操作的结果就是约束也被 drop 了。
查看表 T 中的外键约束状态:
SHOW TABLE STATUS FROM yourdatabasename LIKE 'T'
InnoDB 还不支持 CASCADE ON DELETE 或者其特殊的约束选项。(我们知道 Oracle 里面有这个东东了)
处理自动增量的列的时候需要注意的问题是:自动增量的列不参加锁机制和事务处理,因此回滚时,会造成序列中间的空档。
增加 InnoDB 数据和日志文件
不能增大 InnoDB 数据文件的长度,增加表空间的办法是新添加数据文件:
innodb_data_file_path,然后重新启动 MySQL 。
同样的,目前你还不能删除数据文件,为了减小数据文件的长度,需要导出数据,建立新数据库,然后再导入。
如果需要改变日志文件的大小,可以先关闭 MySQL ,然后把旧的日志文件移动到一个备份目录,修改 my.cnf ,重新启动 MySQL ,确信 InnoDB 正常启动后,可以把旧的日志文件删除了。
InnoDB 数据库的备份:
关闭 MySQL ,并确保正常关闭。
复制所有的数据文件。
复制所有的 InnoDB 日志文件。
复制 my.cnf 配置文件。
复制所有 InnoDB 表的 .frm 文件。
目前还没有热备份或者增量备份的工具。对于要求高可靠的服务器而言,可以采用复制的形式。
数据恢复的过程,就是把前面备份的这些文件重新考回原来的位置。这种情况只有在数据文件损坏的情况下,才有必要。一般的数据库瘫痪,重新启动 MySQL ,InnoDB 会恢复事务。
如果确实有表空间不能回复的话,可以采用 SELECT INTO OUTFILE 来恢复数据。这个时候需要在 my.cnf 中设置:
set-variable = innodb_force_recovery = 4
InnoDB 的数据文件在所有平台上二进制兼容,因此只要只要两台机器的浮点数格式一致,你就可以在这两台机器之间移动文件。
锁机制的叙述和解释比较繁杂,这里跳过原文第八章( http://www.innodb.com/ibman.html )关于锁机制的描述,我们直接讲述性能调优的几个提示:
1. 如果 CPU 资源利用率小于 70% 的话,你的负载可能是由于磁盘引起的,可能有太多的事务提交,或者缓冲池太小。建议增加缓冲池。
2. 把多个修改包在一个事务里面, InnoDB 每次提交事务需要刷新日志到磁盘,而磁盘的速度和 CPU 相比一般都很慢,因此,建议不要频繁提交事务。
3. 如果你能承受最近几个事务的丢失,建议设置 innodb_flush_log_at_trx_commit 为 0 ,InnoDB 每秒刷新一次日志。
4. 加大日志文件,组合起来的所有日志文件大小应该和缓冲池一样大,很小的日志文件将会导致很多不必要的磁盘写操作,大日志文件的缺陷是恢复时间会加长。
5. 同样需要加大日志缓冲,例如 8 MB。
6. 采用 VARCHAR 类,而不是 CHAR 类型,小的表更适合缓冲池,从而较少了磁盘 I/O。
7. 在 Linux 和一些 Unix 系统上,采用 Unix fsync 命令刷新文件,但是有些情况下,可能会很慢,可以修改 innodb_flush_method 为 O_DSYNC 来提高写性能。
8. 导入数据时,要确保 autocommit=1 没有打开,在导入的 SQL 文件最前面加入:
set autocommit=0;
commit;
如果采用 mysqldump --opt 选项,你得到的 dump 文件能快速导入 InnoDB 表。
9. 留意大批量插入时的回滚操作。
10. 留意那些消耗磁盘资源的操作,采用 DROP TABLE 或者 TRUNCATE 来清空表,而不是DELETE FROM 。.
11.如果要插入多行时, 使用多行 INSERT ,来减轻客户端和服务器端的通信量。
INSERT INTO yourtable VALUES (1, 2), (5, 5);
上面的多行(原文为 multi-line,我认为应该为 multi-row)。这条提示不仅仅适用于 InnoDB ,对于其他表类型也适用。
从 3.23.42 开始,InnoDB 包括了 InnoDB 监视器,能输出InnoDB 内部状态的信息,这些数据在性能调优时十分有用,当打开时,监视器能每15秒在服务器端输出数据到标准输出,如果不是从命令行启动的话,这些输出会写入到 .err 文件中,在 Windows 平台上,必须在 DOS 命令行下以 --standalone --console 参数启动。
主要信息包括:
每个激活的事务锁住的表以及记录
事务的锁等待
线程的信号等待
延迟的文件 i/o 请求
缓冲池统计以及删除和插入缓冲合并的活动
启动的命令为:
CREATE TABLE innodb_monitor(a int) type = innodb;
停止的语法是:
DROP TABLE innodb_monitor;
如果数据库关闭时,监视器还在运行,下次启动监视器前必须先关闭。
用同样的语法你可以启动 innodb_lock_monitor 以及 innodb_tablespace_monitor
除了锁机制以外,本文没有讲述的内容还有表和索引的结构,记录的物理结构,文件空间的管理,错误处理,InnoDB 表的限制等,请继续关注本站的后续报道。
在后面的报道中,您将会了解到 InnoDB 的一些物理设计仿照了 Oracle ,因此,能够获得和 Oracle 可以类比的性能并不足以为奇。
- 浏览: 2669888 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
发表评论
-
MySQL 中的重做日志,回滚日志 ,以及二进制日志的简单总结
2018-06-06 17:44 1177ImportNew 5天前 (点击上方公众号,可快速关注) ... -
mysql 设置字符集 中文乱码
2016-02-04 15:45 2911一、登录MySQL查看用SHOW VARIABLES LIK ... -
mysql slow log控制
2014-08-28 10:15 5342参考官方文档:http://dev.mysql.com/do ... -
MySQL数据库InnoDB存储引擎 Buffer Pool Flush List详解
2014-08-21 10:36 1250原文:http://www.zhdba.com/mysqlo ... -
Percona-Server安装记录
2014-07-28 23:05 1419本文档记录安装Percona-Server开发环境,非生产 ... -
mysql创建用户权限
2014-07-11 17:01 777mysql 权限如下: root@localhost : ... -
mysql group测试脚本
2014-06-25 15:38 857sql数据语句: CREATE TABLE `access ... -
mysql性能优化之 show profile
2014-06-20 10:46 2444很漂亮的结果,没有creating sort index ... -
MYSQL INNODB中GAP LOCK引起死锁的问题
2014-06-06 13:08 2311先了解一下什么是GAP LOCK 在INNODB中,rec ... -
MySQL出现Waiting for table metadata lock的场景浅析
2014-04-23 14:27 703原文:http://ctripmysqldba.iteye ... -
mysql 索引原理
2014-03-27 20:02 501对于这条SQL: from message where ... -
mysql中group的实现
2014-01-24 10:31 751同学问到group by的实现 ... -
MySQL Innodb日志机制深入分析
2013-12-02 22:28 01.1. Log & Checkpoint In ... -
优化临时表使用,SQL语句性能提升100倍
2013-12-02 22:25 950【问题现象】 线上mysql数据库爆出一个慢查询,DBA观 ... -
也说快速关闭MySQL/InnoDB
2013-09-21 13:56 798原文:http://www.orczhou.com/ind ... -
关于mysql优化一些总结
2013-09-21 08:41 1077最近在做mysql数据库的 ... -
robbin谈MySQL InnoDB性能调整的一点实践
2013-09-21 08:13 763因为JavaEye网站的数据 ... -
mysql文档集合
2013-09-05 12:11 856理解MySQL——索引与优化 理解MySQL——架构与概念 ... -
mysql binlog细节
2013-09-05 12:06 1037原来mysql binlog内容是先保存在trx_cache中 ... -
MySQL如何避免使用swap
2013-09-04 09:52 1073原文: http://www.taobaodba.com/ ...
相关推荐
本文详细介绍了MySQL InnoDB存储引擎中的索引原理及其实现方式,特别是B+树的应用。通过对比不同的树形结构,我们了解到B+树为何成为数据库索引的理想选择。此外,还讨论了InnoDB与MyISAM的主要差异,以及索引的插入...
#### 二、理解InnoDB与MySQL的关系 InnoDB作为MySQL的一个存储引擎,其实质上是一个插件。当您安装MySQL时,默认情况下InnoDB可能已经被包含在内。然而,在某些特定情况下,如使用的是定制版本或者轻量级安装包时,...
本文将详细介绍InnoDB的一些关键参数及其对数据库性能的影响,并提供一些优化建议。 #### 二、InnoDB参数详解 ##### 1. `innodb_data_home_dir` - **描述**:此参数用于指定InnoDB表空间的根目录。如果未在`my.cnf...
下面将详细介绍这个搭建过程。 一、简介 InnoDB Cluster 是 Mysql 的一个高可用性解决方案,它可以将多个 Mysql 节点组合成一个集群,提供高可用的数据库服务。InnoDB Cluster 可以分为两种情况,即实验环境使用 ...
#### 二、InnoDB简介 InnoDB是MySQL数据库的一种默认存储引擎,自MySQL 5.5版本开始,默认启用InnoDB。它支持事务处理、行级锁定、外键约束等功能,适用于需要高并发和高可靠性的应用场景。此外,InnoDB还提供了...
在MySQL中,InnoDB存储引擎的索引分为聚簇索引(主键索引)和非聚簇索引(二级索引)。聚簇索引的叶子节点直接包含数据行,而非聚簇索引的叶子节点则包含指向数据行的指针。 BTree索引的主要优点在于提高了数据检索...
本篇文章将详细解析如何通过`mysqldump`命令进行InnoDB类型的数据备份,并重点介绍如何利用`--single-transaction`参数来提高备份数据的完整性。 #### 一、基本概念 1. **InnoDB存储引擎**:是MySQL中最常用的存储...
- **附录二**:提供了关于 InnoDB 存储引擎的更多细节,包括其实现原理和技术特点。 - **附录三**:探讨了 InnoDB 如何管理内存,包括缓冲池的使用等。 - **附录四**:列举了一些实际应用中的案例研究,展示了如何...
- **InnoDB非主键(二级索引)**:每个非主键索引都指向主键值,而非直接的数据行。 - **InnoDB与MyISAM索引对比**:InnoDB的索引结构更加复杂,支持更多的高级功能。 #### 事务案例分析 **案例一**:假设有一个...
#### 二、InnoDB存储架构概述 InnoDB的存储管理类似于Oracle的分层存储管理方式,但增加了共享表空间和独立表空间的概念。InnoDB的存储结构由多个层级构成,从大到小依次是表空间、段、区、页。以下是这些概念的详细...
虽然原文未详细介绍具体的锁算法,但从上述内容中我们可以推断出InnoDB中涉及的关键算法: - **锁兼容性检查算法:** 当一个事务试图获取某行的锁时,需要检查是否与其他事务的现有锁兼容。例如,共享锁之间是兼容...
前言 读这篇文章之前可以先了解一下MySQL中InnoDB数据结构 一、InnoDB引擎对隔离...二、锁的介绍 1、表锁、行锁 通过锁来管理不同事务对共享资源的并发访问 表锁与行锁的区别: 锁定粒度:表锁 > 行锁 加锁效率:表锁
第二部分深入探讨 InnoDB 存储引擎,从其特点和优势出发,详细阐述其工作原理和实际应用方法。第三部分则通过实际案例分析,帮助读者更好地理解 MySQL 技术内幕和 InnoDB 存储引擎的应用。每一部分都配备了相应的...
本文将详细介绍如何在MySQL中配置支持事务的操作以及启用InnoDB存储引擎的方法。 #### 二、InnoDB存储引擎简介 InnoDB是MySQL中默认的存储引擎之一,提供了ACID事务的支持,确保数据的一致性和可靠性。此外,InnoDB...
这两个文档可能详细介绍了InnoDB如何识别需要换出的页面,以及如何决定哪些页面应优先放入L2 Cache。此外,由于InnoDB支持数据页的压缩,处理压缩页的换出可能涉及到解压缩、写入L2 Cache、再压缩回SSD的过程,这...
#### 二、InnoDB存储引擎详解 InnoDB是MySQL中默认的存储引擎,主要特点包括: 1. **事务支持**:InnoDB存储引擎提供了完整的事务支持,包括ACID(原子性、一致性、隔离性和持久性)属性,确保数据的一致性和可靠...
本文将详细介绍如何通过模拟不同的并发场景来理解和调试InnoDB中的死锁问题。 #### 二、知识点详解 ##### 1. 并发事务与间隙锁互斥 **概念解析:** - **间隙锁(Gap Locks)**:InnoDB为了解决幻读问题,在事务...