MySQL的binlog日志的作用
- 1:用来记录mysql内部增删改查等对MySQL数据有更新内容的记录。像show和select一般不会记录
- 2:mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000002 -
MySQL5.6以后需要用此命令来查看,可以避免出现乱码
- 3:mysqlbinlog拆库,拆除test库的所有操作,然后进行恢复
mysqlbinlog -d test mysqlbin.000002 > test.sql
- 4:mysqlbinlog mysqlbin000002 --start-position=510 --stop-position=1312 -r pos.sql
输出初始位置为510,结束位置为1312,导出到sql文件
mysqlbinlog
此命令是用来解析mysqlbinlog日志,mysql-bin.index记录了所有的binlog文件。
--master-data
如果值等于2,结果如下:
--CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000020', MASTER_LOG_POS=191;
此行会被注释掉,我们要的文件名以及位置点。就是我们的备份点。
如果值等于1,结果如下:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000020', MASTER_LOG_POS=191;
代表这条语句是可执行的。用在slave库上。
错误日志(error log)
记录MySQL服务进程mysqld在启动/关闭或运行过程中遇到的错误日志信息
log-error=/var/log/mysqld.log
查询日志(query log)
1:普通查询日志(general query log):记录客户端连接信息和执行SQL语句信息,一般不建议开启,会造成磁盘I/O。
show variables like 'general_log%';
general_log
general_log_file
2:慢查询日志(slow query log): 记录执行时间超出指定值(long query time)的sql语句。
slow_query_log = ON
log-slow-queries=/var/lib/mysql/slow.log
long_query_time=2
log-queries-not-using-indexes #未使用索引的语句
二进制日志(binary log)
记录数据被修改的相关信息
log-bin = mysql-bin
log-slave-updates
MySQL清除错误的连接
mysql> FLUSH HOSTS;
Query OK, 0 rows affected (0.00 sec)
binlog的三种模式
1:statement level
每一条会修改数据的sql都会记录到master的bin-log中。slave在复制的的时候sql进程会解析成原来master端执行过的相同的sql来再次执行。
优点:解决row level下的缺点,不需要记录每一行数据的变化。减少binlog日志量,节约I/0提高性能。记录Master上所执行的语句细节,以及执行语句时候的上下文信息。
缺点:bug比较多,会造成mysql复制出现问题,如在存储过程中使用last_insert_id()函数,会使slave和master上得到不一致的ID等等。
2:Row Level
日志中会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。
优点:binlog中可以不记录执行的sql语句的上下文相关信息,仅仅只需要记录哪一条记录被修改了,修改成什么样了。会清楚的记录下每一行数据修改的细节。不会出现某些特定情况下的存储过程、或function,以及trigger的调用和触发无法被正确复制的问题。
缺点:binlog日志量会很大。尤其是alter table之类的表结构变更语句,实际上会导致重建整个表。
3:Mixed Level
实际上是前两种模式的结合。在mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,在statement 和 row 之间选择一种。新版本中的statment level 还是和以前一样,仅仅记录执行的语句。而新版本的MySQL中对row level模式也做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement 模式来记录,如果sql 语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
默认是行模式
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)