`
rq2_79
  • 浏览: 240333 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

InnoDB 介绍(二)

阅读更多
上一节我们简要介绍了 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 可以类比的性能并不足以为奇。
分享到:
评论

相关推荐

    MySQL Innodb 索引原理详解

    本文详细介绍了MySQL InnoDB存储引擎中的索引原理及其实现方式,特别是B+树的应用。通过对比不同的树形结构,我们了解到B+树为何成为数据库索引的理想选择。此外,还讨论了InnoDB与MyISAM的主要差异,以及索引的插入...

    mysql安装innodb插件

    #### 二、理解InnoDB与MySQL的关系 InnoDB作为MySQL的一个存储引擎,其实质上是一个插件。当您安装MySQL时,默认情况下InnoDB可能已经被包含在内。然而,在某些特定情况下,如使用的是定制版本或者轻量级安装包时,...

    InnoDB: Hot Backup Manual

    #### 二、创建备份 本节将详细介绍如何使用ibbackup创建完整的压缩与非压缩备份。 ##### 2.1 示例:创建未压缩的备份 要创建一个未压缩的InnoDB备份,可使用以下命令: ``` ibbackup --compress=no my.cnf my2....

    MySQL Innodb 参数详解与优化实践

    本文将详细介绍InnoDB的一些关键参数及其对数据库性能的影响,并提供一些优化建议。 #### 二、InnoDB参数详解 ##### 1. `innodb_data_home_dir` - **描述**:此参数用于指定InnoDB表空间的根目录。如果未在`my.cnf...

    Mysql 高可用 InnoDB Cluster 多节点搭建过程

    下面将详细介绍这个搭建过程。 一、简介 InnoDB Cluster 是 Mysql 的一个高可用性解决方案,它可以将多个 Mysql 节点组合成一个集群,提供高可用的数据库服务。InnoDB Cluster 可以分为两种情况,即实验环境使用 ...

    mySql 存储引擎 启用 Innodb

    #### 二、InnoDB简介 InnoDB是MySQL数据库的一种默认存储引擎,自MySQL 5.5版本开始,默认启用InnoDB。它支持事务处理、行级锁定、外键约束等功能,适用于需要高并发和高可靠性的应用场景。此外,InnoDB还提供了...

    mysql,innodb索引介绍

    在MySQL中,InnoDB存储引擎的索引分为聚簇索引(主键索引)和非聚簇索引(二级索引)。聚簇索引的叶子节点直接包含数据行,而非聚簇索引的叶子节点则包含指向数据行的指针。 BTree索引的主要优点在于提高了数据检索...

    mysql备份innodb类型的表或数据库

    本篇文章将详细解析如何通过`mysqldump`命令进行InnoDB类型的数据备份,并重点介绍如何利用`--single-transaction`参数来提高备份数据的完整性。 #### 一、基本概念 1. **InnoDB存储引擎**:是MySQL中最常用的存储...

    MySQL InnoDB 查询优化实现分析

    - **附录二**:提供了关于 InnoDB 存储引擎的更多细节,包括其实现原理和技术特点。 - **附录三**:探讨了 InnoDB 如何管理内存,包括缓冲池的使用等。 - **附录四**:列举了一些实际应用中的案例研究,展示了如何...

    Innodb存储引擎浅析—事务系统

    - **InnoDB非主键(二级索引)**:每个非主键索引都指向主键值,而非直接的数据行。 - **InnoDB与MyISAM索引对比**:InnoDB的索引结构更加复杂,支持更多的高级功能。 #### 事务案例分析 **案例一**:假设有一个...

    辛星笔记之InnoDB锁

    虽然原文未详细介绍具体的锁算法,但从上述内容中我们可以推断出InnoDB中涉及的关键算法: - **锁兼容性检查算法:** 当一个事务试图获取某行的锁时,需要检查是否与其他事务的现有锁兼容。例如,共享锁之间是兼容...

    MySQL中InnoDB锁的介绍及用途

    前言 读这篇文章之前可以先了解一下MySQL中InnoDB数据结构 一、InnoDB引擎对隔离...二、锁的介绍 1、表锁、行锁 通过锁来管理不同事务对共享资源的并发访问 表锁与行锁的区别: 锁定粒度:表锁 &gt; 行锁 加锁效率:表锁

    MySQL技术内幕:InnoDB存储引擎.docx

    第二部分深入探讨 InnoDB 存储引擎,从其特点和优势出发,详细阐述其工作原理和实际应用方法。第三部分则通过实际案例分析,帮助读者更好地理解 MySQL 技术内幕和 InnoDB 存储引擎的应用。每一部分都配备了相应的...

    mysql支持事务配置,配置InnoDB引擎

    本文将详细介绍如何在MySQL中配置支持事务的操作以及启用InnoDB存储引擎的方法。 #### 二、InnoDB存储引擎简介 InnoDB是MySQL中默认的存储引擎之一,提供了ACID事务的支持,确保数据的一致性和可靠性。此外,InnoDB...

    MySQL-InnoDB

    这两个文档可能详细介绍了InnoDB如何识别需要换出的页面,以及如何决定哪些页面应优先放入L2 Cache。此外,由于InnoDB支持数据页的压缩,处理压缩页的换出可能涉及到解压缩、写入L2 Cache、再压缩回SSD的过程,这...

    myisam和innodb的区别

    #### 二、InnoDB存储引擎详解 InnoDB是MySQL中默认的存储引擎,主要特点包括: 1. **事务支持**:InnoDB存储引擎提供了完整的事务支持,包括ACID(原子性、一致性、隔离性和持久性)属性,确保数据的一致性和可靠...

Global site tag (gtag.js) - Google Analytics