mysqldump
备份
备份 cabbage_server 数据库内容,保证备份数据一致性,备份完毕刷新binlog文件,在备份文件里记录好日志信息
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 cabbage_server > cabbage.sql
--single-transaction
在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB。--flush-logs
为结束当前日志,生成新日志文件。--master-data=n
值为1,会记录 Position 点并执行 CHANGE MASTER TO MASTER_LOG_FILE='bin-log.xxxx', MASTER_LOG_POS=xxxx; 语句,为值 2 则记录但会注释 CHANGE MASTER 语句,不会被执行,通常我们都会设置为2,只有在做主从搭建,需要备份主库数据给从库时,才用到设置为1
备份所有数据库
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --all-databases > all-databases.sql
还原
进入mysql终端进入指定数据库,删除数据表,然后运行
mysql>source /opt/cabbage.sql
binlog
开启binlog
开启binlog,在 [mysqld] 下配置以下参数
#binlog存放路径
log-bin=mysql-bin
#binlog格式
binlog_format=mixed
#服务器标识
server-id = 1
#binlog存放天数
expire_logs_days = 10
#磁盘同步
sync_binlog = 0
sync_binlog
这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。
sync_binlog=0
当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。sync_binlog=n
当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
几个常用查看binlog sql指令
查看指定binlog文件的内容
show binlog events in 'mysql-bin.000002';
查看当前使用的二进制文件及所处位置
show master status;
查看Binlog文件列表
show binary logs;
查看主服务器使用的二进制文件及大小
show master logs;
刷新binlog日志文件
flush logs
查看binlog的每条内容的事件信息
show binlog events in 'mysql-bin.000021';
Event_type
几个常见事件类型说明:
Format_desc
每个binlog开头的事件,用于信息描述Rotate
记录最后一条事件,并执行延续下一条事件的binlog文件和位置Query
执行语句intvar
针对自增键类型auto_increment,进行自增id插入语句Xid
事务提交语句
分析binlog里面的内容
默认binlog是二进制文件,无法直接查看分析,可以通过 mysqlbinlog
指令将binlog转为可视化sql语句进行分析
1.查看binlog
mysqlbinlog mysql-bin.000001
如果需要查看多个binlog文件,可以空格填入
mysqlbinlog mysql-bin.000001 mysql-bin.000002
# at 1771
#180326 18:15:50 server id 1 end_log_pos 1917 CRC32 0x38530371 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1522059350/*!*/;
alter table `log_request` add index `log_request_path_index`(`path`)
/*!*/;
at 1771
该事件记录从文件第 1771 个字节开始180326 18:15:50
事件发生的时间戳 2018-03-26 18:15:50server id 1
服务器标识end_log_pos 1917
结束点在第 1917 个字节exec_time=0
花费的时间error_code=0
错误码 0为正常
2.查看指定数据库binlog
mysqlbinlog -d cabbage_server mysql-bin.000001
mysqlbinlog -database cabbage_server mysql-bin.000001
3.将内容输出到文件中
mysqlbinlog -d cabbage_server mysql-bin.000001 > cabbage.sql
4.禁止恢复过程产生日志
在使用binlog日志文件进行数据库恢复时,该过程中也会产生日志文件,通过 -D
选项可以禁止此处操作会产生的binlog
mysqlbinlog -D mysql-bin.000001
也可以使用 --disable-log-bin 选项,效果相同。
mysqlbinlog --disable-log-bin mysql-bin.000001
5.从特定的位置编号开始读,截止到特定位置取数据
使用 -j 或 --start-position 选项 从位置编号为15028处开始读取数据。
mysqlbinlog -j 15028 mysql-bin.000001 > from-15028.out
mysqlbinlog --start-position 15028 mysql-bin.000001 > from-15028.out
使用 --stop-position 选项 可以截止到特定的编号位置
mysqlbinlog --stop-position 154 mysql-bin.000001 > upto-154.out
获取 4至154 ,包括4,不包括154 的内容
mysqlbinlog --start-position 4 --stop-position 154 mysql-bin.000001 > sql.out
6.从特定的时间开始读,截止到特定位时间数据
使用 --start-datetime 和 --stop-datetime ,读取 "2018-04-01 10:00:00" 至 "2018-04-05 10:00:00" 的数据
mysqlbinlog --start-datetime="2018-04-01 10:00:00" --stop-datetime="2018-04-05 10:00:00" mysql-bin.000001
7.读取远程服务器 binlog
mysqlbinlog -R -P 3306 -h 192.168.2.21 -p mysql-bin.000001
mysqlbinlog --read-from-remote-server --port=3306 --host=192.168.2.21 --password mysql-bin.000002
数据恢复
恢复步骤:
- 1.导出需要还原的语句sql,例如导出"2018-04-01 10:00:00" 至 "2018-04-05 10:00:00" 的 cabbage_server库 数据
mysqlbinlog --start-datetime="2018-04-01 10:00:00" --stop-datetime="2018-04-05 10:00:00" -d cabbage_server mysql-bin.000001 mysql-bin.000002 > cabbage.sql
- 2.进入mysql终端进入指定数据库运行
mysql>source /opt/cabbage.sql
根据全备和binlog增备进行准确时间点恢复
针对 cabbage_server 数据库还原来说明,假设我们服务器每天凌晨4点开始进行一次全备。现在需要还原到2018-04-02 10:00:00时的数据,恢复步骤:
-
1.先将当期数据库 cabbage_server 进行备份。
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 cabbage_server > old.sql
-
2.取出 2018-04-02 凌晨4点时的全备 sql语句文件,改名为 full.sql, 并查看此文件备份时记录的binlog日志信息,假如刷新到了 mysql-bin.000018 文件。
-
3.采用 mysqlbinlog 根据时间段 2018-04-02 04:00:00 至 2018-04-02 10:00:00,读取binlog文件是从 mysql-bin.000018 到当前最新的文件,将符合条件的数据读取出来保存到 sub.sql 文件中。
mysqlbinlog --start-datetime="2018-04-02 04:00:00" --stop-datetime="2018-04-02 10:00:00" -d cabbage_server mysql-bin.000018 mysql-bin.000019 ... > sub.sql
-
4.删除数据库 cabbage_server 里所有数据表
-
5.进入mysql终端进入指定数据库,依次执行 full.sql , sub.sql ,执行完毕即可恢复完成,查看数据还原情况
mysql> source /opt/full.sql;
mysql> source /opt/sub.sql;
参考
https://blog.csdn.net/u011341352/article/details/52835887
https://blog.csdn.net/wade5200/article/details/76576570
http://www.ttlsa.com/mysql/super-useful-mysqlbinlog-command/