mysql 默认引擎innodb 初探(三)

写在前

本篇博客承接上一篇 mysql 默认引擎innodb 初探(二)继续对mysql数据库 innodb存储引擎进行探索

innodb 文件

mysql数据库和innodb存储引擎表的各种类型文件:

  • 参数文件
  • 日志文件(错误日志文件,二进制日志文件,慢查询日志文件,查询日志文件)
  • socket文件(Unix套接字连接,避免走tcp协议,web服务器和mysql服务器在同一机器上时可用于提高通信提高效率)
  • pid文件(保存mysql实例进程ID)
  • mysql表结构文件
  • innodb存储引擎文件

参数文件

查看mysql配置文件

mysql --help | grep my.cnf

查当前mysql实例配置项

show variables like "innodb%"\G

配置参数:

  • 动态参数(dynamic)【mysql实例运行中可以更改】
  • 静态参数(static)【实例生命周期内不得进行更改 eg : datadir 】

动态设置参数格式

set [@@global. | @@session.]system_var_name = expr

eg :
   set read_buffer_size = 1024000;
   set @@session.read_buffer_size = 2048000;
   set @@global.read_buffer_size  = 4096000;

静态参数是不能动态修改的,强制修改会报错;

有些动态参数只能在会话中(session)修改,eg : autocommit ;

有些动态参数修改后整个实例都会生效, eg : binlog_cache_size ;

有些动态参数即可用在会话中修改,也可以在整个生命期内修改, eg : read_buffer_size ;

日志文件

日志文件记录了mysql数据库的各种活动,通过分析日志可用快速精确查找问题并优化;

  • 错误日志 (error log)
  • 二进制日志(binlog)
  • 慢查询日志(slow query log)
  • 查询日志(log)

错误日志

错误日志记录了mysql的启动,运行,关闭过程,通过该文件可以快速定位问题;

查看mysql实例错误文件路径

show variables like "log_error"\G

慢查询日志

慢查询日志允许你可以设置一个阀值,运行时间超过该阀值的所有sql语句都会记录在慢查询日志文件中;

可以很好的帮助优化数据库,;

show  variables like "slow_query_log"\G   # 查看是否开启慢查询日志
set   slow_query_log = ON|OFF;  # 开启|关闭慢查询日志

show variables like "log_output"\G   # 查看慢查询日志记录到文件还是表中
set log_output=TABLE|FILE;  # 设置慢查询日志输出到table or files中 

show variables like "slow_query_log_file"\G  # 查看慢查询日志文件路径

show  variables like "long_query_time"\G  # 查看慢查询阀值
set long_query_time=10;  # 设置慢查询阀值为10s

show variables like "log_queries_not_using_indexes"\G # 查看是否开启,没有使用索引也记录到慢查询日志中
set log_queries_not_using_indexes=ON|OFF;  # 开启or关闭

show variables like "log_throttle_queries_not_using_indexes"\G # 每分钟 允许【因为没有使用索引】而记录到慢查询日志中的sql语句数
# log_throttle_queries_not_using_indexes = 0; 表示不限制数量,可能会频繁记录,要小心

  • 使用mysqldumpslow工具分析慢查询日志文件 (当设置log_output=FILE时)

  • 查看慢查询日志表(当设置log_output=TABLE时)

slow_log表默认是 CSV存储引擎,对查询效率不是很高,可以设置为MySIAM;不过个人建议设置成Archive存储引擎;

查询日志

查询日志记录所有mysql请求(insert,update,delete,select),无论是否正确;

默认记录到到文件中,打开log_output=TABLE后记录到mysql.general_log表中;


show variables like "general_log"\G   # 查看是否开启查询日志
set @@global.general_log = ON|OFF;   # 开启or关闭查询日志

show variables like "general_log_file"\G  # 查看查询日志文件路径

show variables like "log_output"\G  # 查看查询日志输出到文件还是表中

一般建议关闭,默认也是关闭查询日志;

二进制日志

二进制日志记录mysql数据库执行更改的所有操作(不包括select,show 等查询操作)

  • 恢复(recovery) eg : 进行point-in-time恢复
  • 复制(replication) eg : master-slave 复制
  • 审计(audit) eg : 分析二进制日志文件,查看是否有注入攻击等

配置文件中设置 log-bin [=binlog_file_name] 开启二进制日志;

如果不指定binlog_file_name默认为主机名;

二进制日志文件放在 datadir数据目录下

show variables like "datadir"\G 

mysql-bin.index文件为二进制的索引文件,存放二进制日志序号

二进制日志相关配置参数:

  • max_binlog_size

    指定单个二进制文件最大值,超过该大小,将产生新的二进制文件,后缀+1,并记录到.index文件中

  • binlog_cache_size

    当执行事务时,所有未提交的二进制日志会记录到一个缓存中,

    等事务提交时,直接将缓存中的二进制日志写入到二进制日志文件中,

    binlog_cache_size 设定缓存大小,默认为32k;

    binlog_cache_size是基于会话(session)的,

    当一个线程开始一个事务时,mysql就会自动分配一个大小为binlog_cache_size的缓存,

    因此binlog_cache_size不能太大【好像nginx的client_header_buffer_size也是这样的】

  • sync_binlog

    默认二进制日志不是每次写都会同步到磁盘,当数据库发生宕机时,可能会有部分数据没有刷盘;

    sync_binlog设置没写缓冲多少次就同步到磁盘,默认sync_binlog=0

    使用innodb存储引擎进行复制时,为了获得最大高可用性,建议开启

  • binlog-do-db
  • binlog-ignore-db
  • log-slave-update

    binlog-do-db | binlog-ignore-db 指定那些库或者忽略那些库写二进制日志

    log-slave-update 指定哪些要进行主从同步

  • binlog_format
    • STATEMENT 二进制日志记录逻辑sql语句,
    • ROW 记录表的行更改情况,会占用更多存储空间,主从复制时,会增加网络开销;但是有更好的 可靠性
    • MIXED 默认采用STATEMENT,特殊采用ROW

    可以使用mysqlbinlog工具分析二进制文件

套接字文件

unix本地可以 使用套接字连接mysql

可以参考ngigx调用php-cgi的方式

pid文件

保存mysql进程ID

mysql表结构定义文件

无论使用何种存储引擎,mysql都会为每张表建立一个后缀为frm的文件,文件中定义了表结构。

innodb存储引擎文件

以上介绍的文件都是mysql数据库本身文件,和存储引擎无关;

InnoDB存储引擎拥有自己的文件:

  • 表空间文件
  • 重做日志文件

表空间文件

show variables like "innodb_file_per_table"\G
set innodb_file_per_table = ON|OFF;  # 开启or关闭独立表空间

show variables like "innodb_data_file_path"\G   # 查看共享表空间文件

开启innodb_file_per_table独立表空间后,独立表空间只存储该表的数据、索引、插入缓冲bitmap等信息;其他信息依然存放在共享表空间中,如插入缓冲数据等;

重做日志文件

Inoodb存储引擎的数据目录下有两个名为ib_logfile0 和 ib_logfile1的文件;

每个存储引擎至少有1个重做日志组(group)

每个组至少有2个重做日志文件,默认为ib_logfile0 , ib_logfile1,两文件大小一致,以循环写入的方式运行;

重做日志文件相关配置参数 :

  • innodb_log_file_size 指定日志文件大小
  • innodb_log_files_in_group 指定每个文件组下重做日志文件数量
  • innodb_mirrored_log_groups 指定日志镜像文件组的数量,默认为 1,没有镜像
  • innodb_log_group_home_dir 日志文件组所在路径

tips : 重做日志文件过大,在恢复数据时可能会耗费很长时间;过小,会频繁切换重做日志,导致频繁async checkpoint;

二进制日志文件与重做日志文件对比:

  • 二进制日志文件记录mysql数据库相关日志,包括所有存储引擎 ;重做日志文件记录Innodb存储 引擎事务日志
  • 二进制日志文件更具binlog_format不同,分别记录逻辑sql语句(STATEMENT),具体更新内容(ROW),根据场景混合使用(MIXED);重做日志文件记录每个页的物理更改;
  • 二进制日志不断写入二进制日志缓冲中,事务提交时刷盘一次;重做日志,在事务过程中不断写入到重做日志文件中

checkpoint技术一个触发条件就是事务提交,使用innodb_flush_log_at_trx_commit参数可以控制事务提交时要不要强制将重做日志写盘;

innodb_flush_log_at_trx_commit:

  • 0 : 事务提交时,不强制将重做日志写入重做日志文件中
  • 1 :事务提交时,将重做日志缓冲同步到磁盘,并fsync(同步文件系统缓存)
  • 2:事务提交时,将重做日志异步刷回磁盘(写到文件系统缓存中)

后记

后续将介绍

  • 索引与算法 B+
  • 事务
时间: 2024-11-05 14:58:07

mysql 默认引擎innodb 初探(三)的相关文章

mysql 默认引擎innodb 初探(二)

写在前 本篇博客承接上一篇 mysql 默认引擎innodb 初探(一)进行对mysql数据库 innodb存储引擎进行探索 mysql默认存储引擎 innodb简介 Innodb是第一个完整支持ACID事务的mysql存储引擎(BDB是第一个支持事务的mysql存储引擎,目前已经停止开发): 主要特点是 支持行锁,MVCC,事务,外键及一致性非锁读,可以有效利用CPU和内存: 各版本对比如下: tips : 如果不支持多回滚段,Innodb最大支持并发事务量被限制为1023 innodb体系架

更改mysql默认引擎为Innodb 单个多个

mysql默认是关闭InnoDB存储引擎的使用的,将InnoDB设置为默认的引擎如下.1. 查看mysql存储引擎情况: mysql>show engines. InnoDB | YES,说明此mysql数据库服务器支持InnoDB引擎.2. 设置InnoDB为默认引擎:在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB3. 重启mysql服务器4. 登录mysql数据库,mysql>show engines.如果出现 InnoDB

Mysql 存储引擎 InnoDB与Myisam的主要区别

MySQL默认采用的是MyISAM. 1,事务处理 innodb 支持事务功能,myisam 不支持. Myisam 的执行速度更快,性能更好. MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交. 2,select ,update ,insert ,delete 操作 MyISAM:如果执行大量的SELEC

MySQL存储引擎InnoDB与Myisam

InnoDB与Myisam的六大区别 InnoDB与Myisam的六大区别 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩 展名为.MYD (MYData).索引文件的扩 展名是.MYI (MYIndex). 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB 事务处理上方面: MyISAM类型的

浅谈MySQL存储引擎-InnoDB&MyISAM

存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的.每一种存储引擎都有它的优势和劣势,本文只讨论最常见的InnoDB和MyISAM两种存储引擎进行讨论.本文中关于数据存储形式和索引的可以查看图解MySQL索引 MySQL逻辑架构图: InnoDB存储引擎 InnoDB是默认的事务型存储引擎,也是最重要,使用最广泛的存储引擎.在没有特殊情况下,一般优先使用InnoDB存储引擎. 1??.数据存储形式

mysql 存储引擎 innodb和myISAM(转)

mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的存储引擎是myISAM innodb: 1.事务操作2.外键操作3.行级锁,这是当有where条件的时候.没有where时,不知道在那一个范围进行搜索时,也是表锁.提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量.4.写的速度快,这是建立在索引的更新操作上 5.InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最

MySQL存储引擎 InnoDB/ MyISAM/ MERGE/ BDB 的区别

MyISAM:默认的MySQL插件式存储引擎,它是在Web.数据仓储和其他应用环境下最常使用的存储引擎之一.注意,通过更改 STORAGE_ENGINE 配置变量,能够方便地更改MySQL服务器的默认存储引擎. InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持. BDB:可替代InnoDB的事务引擎,支持COMMIT.ROLLBACK和其他事务特性. Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问. Merge:允许MyS

MySQL存储引擎Innodb和MyISAM对比总结

Innodb引擎 InnoDB是一个事务型的存储引擎,设计目标是处理大数量数据时提供高性能的服务,它在运行时会在内存中建立缓冲池,用于缓冲数据和索引. Innodb引擎优点 1.支持事务处理.ACID事务特性: 2.实现了SQL标准的四种隔离级别: 3.支持行级锁和外键约束: 4.可以利用事务日志进行数据恢复. Innodb引擎缺点 1.不支持FULLTEXT类型的索引,因为它没有保存表的行数,当使用COUNT统计时会扫描全表. Innodb引擎适用场景 1.需要事务的操作: 2.更新数据需要使

mysql 存储引擎 InnoDB 与 MyISAM 的区别和选择

http://www.blogjava.net/jiangshachina/archive/2009/05/31/279288.html 酷壳 - MySQL: InnoDB 还是 MyISAM? 51cto - InnoDB还是MyISAM 再谈MySQL存储引擎的选择 MyISAM VS InnoDB —— MySQL存储引擎的选择