增量备份依赖于全量备份,因此首先要有全量备份,在全量备份的基础上,添加增量备份。
为了方便操作,我们先来做些准备工作。在客户端直接输入mysql、mysqldump、mysqladmin、mysqlbinlog。看是否能直接出来。
[root@develop mysqlbackup]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection idis 15Server version:5.7.20-log MySQL Community Server (GPL)**********mysql>
[root@develop mysqlbackup]# mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
如果提示 :未找到命令,我们可以创建软链接
# /usr/local/mysql/ 为mysql的安装路径
[root@develop ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin
[root@develop ~]# ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
好了,接下来,我们将正式进入话题。
第一步 :修改my.cnf
(1)添加如下配置
# log_bin为增量备份位置,我这里设置为/var/mysqlbackup/,binlog是它的文件名
log_bin=/var/mysqlbackup/binlog
# server-id 必须要有,可以任意赋值。如果缺失,则无法启动服务。
server-id=127
(2)修改完之后,重启服务,使其生效,生效后,会有下列两个初始化文件
第二步:建立全量备份
mysqldump -uroot -p --all-databases --flush-logs --delete-master-logs --single-transaction -R > /data/mysqlfullbackup/prm1.sql -- 数据全量备份
说明:
/data/mysql/backups/prm1.sql 存放路径,自定义
-u 账户 -p 密码
--all-databases, -A 转储所有数据库中的所有表。会带有CREATE DATABASE 语句。
--databases -B 第一个名称参数视为数据库名称
--tables 表名
--add-drop-database 在每个CREATE DATABASE语句之前添加DROP DATABASE语句
--flush-logs, -F 在开始转储之前刷新MySQL服务器日志文件。
--delete-master-logs 删除前面二进制日志。此选项自动启用 --master-data。此参数可加可不加
--single-transaction 此选项将事务隔离模式设置为, REPEATABLE READ并START TRANSACTION在转储数据之前将SQL语句发送到服务器。它仅对事务表有用,例如InnoDB
--routines, -R 在输出中包含转储数据库的存储例程(过程和函数)
-E, --events 任务
下面开始测试
第三步,往一个表里面增加数据、删除数据
(1)先建一个测试表,有以下原始数据
(2)先添加一些记录
(3)删除一些记录
第四步:刷新日志
由于恢复全量备份的操作会存在日志里,所以先刷新日志,这样恢复全量备份的操作会存在新的日志里,有利于跟前面的增量备份区分开来
使用以下语句
mysqladmin -uroot -p flush-logs;
或者
[root@develop ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection idis 42.....................mysql>flush logs;
Query OK,0 rows affected (0.14 sec)
第五步:恢复全量备份
mysql -uroot -p < /data/mysql/backups/prm1.sql
此步操作有点慢,耐心等候,完成后,我们查看表,已经还原到初始状态
第六步:增量备份还原
(1)查看日志
①将其转化为sql文件
mysqlbinlog --base64-output=decode-rows -vv binlog.000002 > temp.sql
--base64-output使用base-64编码打印二进制日志条目,decode-rows
--verbose重建行事件并将其显示为注释的SQL语句。如果给出此选项两次(通过传入“-vv”或“--verbose --verbose”),则输出包括用于指示列数据类型和一些元数据的注释,以及如果已配置的行查询日志事件。
②找位置和时间节点
找自己想恢复的某个点,我这里找到最后一个插入语句节点
③恢复节点
mysqlbinlog --stop-datetime="2019-01-11 11:10:54" binlog.000002 | mysql -uroot -p
或
mysqlbinlog--stop-position=1449 binlog.000002 | mysql -uroot -p
--start-datetime 在时间戳等于或晚于datetime参数的第一个事件处开始读取二进制日志
--start-position 在位置等于或大于的第一个事件处开始读取二进制日志
--stop-datetime 在时间戳等于或晚于datetime参数的第一个事件处停止读取二进制日志
--stop-position 在位置等于或大于的第一个事件处停止读取二进制日志
恢复后面的
mysqlbinlog --start-position=1449 binlog.000002 | mysql -uroot -p
最后一步:flush logs 刷新日志,开始新的操作
知识点:
要查看所有二进制日志文件的列表,请使用以下语句:
mysql> SHOW BINARYLOGS;
要确定当前二进制日志文件的名称,请发出以下语句:
mysql> SHOW MASTER STATUS;