<服务>MySQL日志和引擎
目录:
错误日志
[mysqld_safe]标签下的log-error指定
mysql> show variables like 'log_error';
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| log_error | /var/log/mysqld.log |
+---------------+---------------------+
1 row in set (0.00 sec)
查询查询
不同查询日志
mysql> show variables like 'general_log%';
+------------------+----------------------------+
| Variable_name | Value |
+------------------+----------------------------+
| general_log | OFF |
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+
2 rows in set (0.00 sec)
慢查询日志
mysql> show variables like '%query%';
+------------------------------+---------------------------------+
| Variable_name | Value |
+------------------------------+---------------------------------+
| long_query_time | 10.000000 |
| slow_query_log | OFF |
| slow_query_log_file | /var/run/mysqld/mysqld-slow.log |
+------------------------------+---------------------------------+
3 rows in set (0.00 sec)
以及是否使用索引
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
1 row in set (0.00 sec)
二进制日志
mysql> show variables like 'log_bin';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
+---------------------------------+-------+
1 rows in set (0.00 sec)
二进制文件的三种工作模式
Statement Level模式
每一条修改数据的SQL语句都会记录到master的binlog中,slave在复制的时候QL线程会解析成和原来master端执行过的相同的SQL来再次执行。
- 优点: Statement Level下的优点是解决了row level下的缺点,不需要记录每一行的变化,减少了binlog日志量,节约IO,提高性能
- 缺点: 由于记录的执行语句,所以为了让slave端也能正确执行,binlog还必须记录每条语句在执行时候的一些相关上下文信息,以保障所有的语句在slave端执行的时候能得到与在master端执行相同的结果。
Row Level模式
日志中会记录成每一行数据被修改的形式,然后slave端再对相同的数据进行修改。举个栗子,主库一次性插入五行,到从也是五行一行一行的改,而不是一次性。
- 优点: binlog不会记录执行的SQL语句及其上下文信息,仅仅只需要记录那一条数据被修改了,修改成什么样子,所以会非常清楚的记录下每一行的修改信息,非常容易理解,而且不会出现在某些特定的存储过程中,例如function或trigger的调用和触发无法被正确的复制,sleep()函数在有些版本就不能进行正确的主从复制,存储过程中使用last_insert_id()函数也有可能获得主从不一致的id
- 缺点: 这样记录在所有执行语句,都将以每行的修改来记录,这样就会产生大量的日志内容,例如update table set own_id = 'w' where own_id = 'c',这样存在多少条where own_id = 'c',就会记录多少条binlog,或者alter table 相当于重建表,相当于该表所有行的日志
Mixed模式
实际上就是前两种模式的结合,在mixed模式下,MySQL会根据执行的每一条具体的SQL语句来区分和对待记录日志的形式,也就是说在Statement和Row中选一种,在新版本中Statement Level模式还是和以前一样,但是Row Level遇到表结构变化的时候会采用statement level来记录,不过update和delete还是用row level
调整模式的方法
mysql> show variables like '%binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
在my.cnf中mysqld标签下进行配置
binlog_format="STATEMENT"
binlog_format="ROW"
binlog_format="Mixed"
在线生效
SET SESSION binlog_format="STATEMENT";
全局生效
SET GLOBAL binlog_format="STATEMENT";
切分binlog日志
mysqladmin -uroot -p123456 flush-log
解析日志
mysqlbinlog --base64-out=decode-rows -v mysql-bin.000016
MySQL存储引擎
最常用的Myisam和Innodb引擎。其他还有HEAP和NDB等等 数据库表里的数据存储在数据库里以及磁盘上,对于用户或者应用程序来说是一张表,无论用什么引擎来存储,用户看到的数据都是一样的,不用的引擎存取,引擎的功能,占用空间的大小,读取性能都可能会有区别。
MySQL架构
- 支持的连接:C API,JDBC,ODBC,.NET,PHP,Python,perl,Ruby,Cobol
- 管理:备份,恢复,安全,同步,集群,管理员行为,配置,迁移,元数据信息
- 连接池 权限,线程同用,连接限制,检查内存,缓存
- 接口DML,DDL,存储过程,视图,触发器
- 查询事务,对象权限
- 优化访问,路径
- 状态,缓存
- 可插线的存储引擎
MySQL事务
逻辑上的一组SQL操作,组成这组操作的各个SQL语句,要么全成功,要么全失败 需要第一个SQL完成,再执行第二个SQL,要么都执行,要么都不执行,这就是事务的原子性。 支持事务的引擎有innodb/ndb(集群)
事务的四大特性
- 原子性(Atomicity) 事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。
- 一致性(Consistency) 事务发生的前和后,数据的完整性必须保持一致
- 隔离性(Isolation) 当并发访问数据库的时候,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务执行的数据是相互隔离的
- 持久性(Durability) 一个事务一旦被提交, 它对数据库中的数据改变就是永久性的,如果错误,事务也不能撤销,只能通过补偿性事务。
事务的开启
数据库默认事务是自动提交的,也就是发一条sql他它就执行一条,如果想多条sql放到一个事务中执行,则需要使用事务进行处理。当我们开启一个事务的时候,并且没有提交,mysql会自动回滚事务,或者我们使用rollback命令手动执行回滚。
- start stransaction 数据库事务开启
- rollback 回滚事务
- commit 提交事务
事务的配置
set GLOBAL autocommit = 0 禁止自动提交,也有的本班需要用ON
set GLOBAL autocommit = 1 开启自动提交,也有的本班需要用OFF
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
MyISAM引擎
MyISAM引擎是MySQL关系型数据库管理系统的默认存储引擎(MySQL5.5.5以前),而在5.5.5版本以后,InnoDB引擎由于事务参照的完整性以及更高的并发性等优点开始逐步取代MyISAM引擎。也并非InnoDB是新兴的,而是InnoDB需要更高的硬件配置才能体现出性能,单现在硬件配置早已不成为问题。
mysql> show create table blog_family\G;
*************************** 1. row ***************************
Table: blog_family
Create Table: CREATE TABLE `blog_family` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`family_name` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.1.73 |
+-----------+
1 row in set (0.00 sec)
MyISAM引擎的表在存储的时候都会有三个文件,这三个文件有着相同的文件名,不同的是后缀名MYD数据文件,MYI索引文件和frm保存表的定义
[root@why ~]# cd /var/lib/mysql/why
[root@why why]# ll
-rw-rw---- 1 mysql mysql 8664 Dec 29 21:01 django_session.frm
-rw-rw---- 1 mysql mysql 2396 Jan 6 11:14 django_session.MYD
-rw-rw---- 1 mysql mysql 3072 Jan 6 11:14 django_session.MYI
[root@why why]# file django_session.MYD
django_session.MYD: DBase 3 data file (1815420928 records)
[root@why why]# file django_session.MYI
django_session.MYI: MySQL MISAM compressed data file Version 1
[root@why why]# file django_session.frm
django_session.frm: MySQL table definition file Version 10
MyISAM引擎的特点
- 不支持事务
- 表级锁定:数据更新时会锁定整个表,锁定的实现成本很小但是也大大降低了并发
- 读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,单读本身并不会阻塞另外的读
- 只能缓存索引:MyISAM可以通过key_buffer_size缓存索引,以大大提高访问性能,减少IO,但是这个缓存区只会缓存索引,而不会缓存数据
- 读取速度较快,占用资源较小
- 不支持外键约束,单支持全文索引
MyISAM引擎应用场景
- 不需要事务的场景
- 读取数据比较多的场景,写入多也可以,读写都频繁的不适合
- 读取并发相对较低的业务,高并发的写入的也可以
- 数据修改相对较少业务
- 以读为主的业务
- 对数据一致性要求不高的场景
MyISAM引擎调优
- 设置合适的索引,例如重复值较少的列,常用的列
- 调整读写的优先级,根据实际需求确保重要操作更优先执行,一般情况下写重要
- 启用延迟插入改善大批量写入性能(降低写入频率,尽可能一次插入多条)
- 尽量顺序插入insert数据都写入尾部,减少阻塞
- 分解大的时间长的操作,降低单个操作的阻塞
- 降低并发数,某些高并发场景通过应用进行排队队列机制
- 对于相对静态(更改不频繁)的数据,利用Query Cache或Memcached,redis缓存服务提高访问速度
- Count全表扫描的时候特别高效,带有条件的count效率较慢
- 如果做主从同步的话,从库比较适合用MyISAM引擎
query缓存配置
query_cache_size = 256M
query_cache_limit = 1M
query_cache_min_res_unit = 2K
key_buffer_size = 2048M #缓存索引的大小
InnoDB引擎
InnoDB优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(即对外键的支持),共享表空间ibdata1,在5.5版本之后支持独立表空间
InnoDB引擎的特点
- 支持事务以及4个事务隔离级别,支持多版本读
- 行级锁定,更新时只锁定当前行(需要通过索引实现,如果是全表扫描仍然会是表锁)
- 读写阻塞与事务隔离级别相关
- 具有非常高效的缓存特性:能缓存索引,也能缓存数据
- 整个表和主键以Cluster方式存储,组成一颗平衡树
- 所有Secondary Index都会保存主键
- 支持分区,表空间
- 在5.5版本后支持外键约束
- 对已经资源要求比较高
InnoDB引擎的使用的场景
- 需要事务支持
- 行级锁定对高并发有很好的适应能力,但需要通过索引确保查询
- 数据更新较为频繁的场景
- 数据一致性要求较高的业务
- 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提供内存的利用率,尽可能减少磁盘IO
相关配置参数
innodb_additional_mem_pool_size = 16M #元数据信息资源池,一般不需要修改,可以通过show innodb status来查看
innodb_buffer_pool_size = 2048M #缓存索引或者数据,减少磁盘IO,官方说一般配置为总内存的50%~80%,不过配置太大会宕机,推荐30%
innodb_data_file_path = ibdata1:1024M:autoextend #数据文件格式
innodb_write_io_threads = 8 #写IO线程(异步IO)
innodb_read_io_threads = 8 #读IO线程
innodb_file_io_threads = 4
innodb_thread_concurrency = 16 #并发线程数
innodb_flush_log_at_trx_commit = 2 #0代表每秒把日志写入日志文件并刷新到磁盘,1代表每次commit把日志写入日志文件并刷新到磁盘,2代表每次commit把日志写入日志文件,每秒进行刷新到磁盘。0性能是最好的了,但是安全性是最差的,宕机会损失1s的数据
innodb_log_buffer_size = 16M
innodb_log_file_size = 128M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120 #锁表时间
innodb_file_per_table = 0 #每个表几个文件
innodb_data_home_dir = #存放目录
innodb_log_group_home_dir =
InnoDB调优
- 主键尽可能少,避免给Secondary index带来过大的空间负担
- 避免全表扫描
- 尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO
- 大批量小插入的时候,控制事务而不使用autocommit自己提交
- 设置合理的innodb_flush_log_at_commit参数(0代表每秒刷新)
- 避免主键更新
各种引擎功能对比
主要比较的是:事务Transactions,锁表细粒度locking granularity,全文索引Full-text search index,数据缓存data cache ,索引缓存index cache和外键支持foreign key support
查看当前版本数据库支持的引擎
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.1.73 |
+-----------+
1 row in set (0.00 sec)
mysql> show ENGINES\G;
*************************** 1. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MyISAM
Support: DEFAULT
Comment: Default engine as of MySQL 3.23 with great performance
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: InnoDB
Support: YES
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 5. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
5 rows in set (0.02 sec)
mysql> select version();
+------------+
| version() |
+------------+
| 5.5.32-log |
+------------+
1 row in set (0.00 sec)
mysql> show engines\G;
*************************** 1. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 3. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 8. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
8 rows in set (0.00 sec)
ERROR:
No query specified
修改引擎的方法
- 最不推荐的是导出数据,然后在修改建表语句,重新导入
- 直接修改表信息
ALTER TABLE tablename ENGINE = INNODB; SHOW CREATE TABLE $tablename;
- mysql_convert_table_format功能
mysql_convert_table_format --host=hostname --user=root --password=123456 --socket= --engine=MyISAM databasename tablename