mysql所有备份与恢复
Posted 别人放弃,我努力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql所有备份与恢复相关的知识,希望对你有一定的参考价值。
一、mysqldump 备份结合 binlog 日志恢复 MySQL 备份一般采取全库备份加日志备份的方式,例如每天执行一次全备份,每小时执行一 次二进制日志备份。这样在 MySQL 故障后可以使用全备份和日志备份将数据恢复到最后一个 二进制日志备份前的任意位置或时间。
1、binlog 介绍 mysql 的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上 开启 binlog),还包括了这些操作的执行时间。为了显示这些二进制内容,我们可以使用 mysqlbinlog 命令来查看。
Binlog 的用途
1:主从同步
2:恢复数据库
开启binary log 功能
通过编辑 my.cnf 中的 log-bin 选项可以开启二进制日志;形式如下:
log-bin [=mysql-bin]
其中,DIR 参数指定二进制文件的存储路径;filename 参数指定二级制文件的文件名,其形 式为 filename.number,number 的形式为 000001、000002 等。
每次重启 mysql 服务或运行mysql> flush logs;都会生成一个新的二进制日志文件,这些日志文件的 number 会不断地递增。 除了生成上述的文件外还会生成一个名为 filename.index 的文件。这个文件中存储所有二进 制日志文件的清单又称为二进制文件的索引
配置保存以后重启 mysql 的服务器,用 mysql> show variables like \'log_bin\';查看 bin-log 是否 开启,
如图:
查看产生的 binary log 注:查看 binlog 内容是为了恢复数据
bin-log 因为是二进制文件,不能通过文件内容查看命令直接打开查看,
mysql 提供两种方式 查看方式,在介绍之前,我们先对数据库进行一下增删改的操作,否则 log 里边数据有点空
#mysql -uroot -p -e "reset master"// 清空所有的二进制文件,从 00001开始
#mysql -uroot -p -e "create database test"
#mysql -uroot -p -e "use test;create table tb1(id int primary key auto_increment,name varchar(20))"
#mysql -uroot -p -e "insert into test.tb1(name) values(\'lisi\')"
#mysql -uroot -p -e "insert into test.tb1(name) values(\'zhangsan\')"
重新开始一个新的日志文件
#mysql -uroot -p -e "flush logs"
#mysql -uroot -p -e "delete from test.tb1 where id=2"
#mysql -uroot -p -e "insert into test.tb1(name) values(\'tom\')"
# mysql -uroot -p -e "select * from test.tb1"
Enter password:
查看 MySQL Server 上的二进制日志
mysql> show binary logs;
查看二进制日志中的事件
mysql> show binlog events;
默认显示可找到的第一个二进制日志文件中的事件,包含了日志文件名、事件的开始位置、 事件类型、结束位置、信息等内容
在实际生产环境中,如果遇到需要恢复数据库的情况,不要让用户能访问到数据库, 以避免新的数据插入进来,以及在主从的环境下,关闭主从。
(查询)# cd /usr/local/mysql/data/
# mysqlbinlog -v(两个v也可以) mysql-bin.000002
从中可以看出 delete 事件发生 position 是 287,事件结束 position 是 416
恢复流程:直接用 bin-log 日志将数据库恢复到删除位置 287 前,然后跳过故障点,再进行恢复 下面所有的操作,命令如下
由于之前没有做过全库备份,所以要使用所有 binlog 日志恢复,所以生产环境中需要很长时 间恢复,导出相关 binlog 文件
#mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 > /opt/mysql-bin.000001.sql
#mysqlbinlog --stop-position=287 /usr/local/mysql/data/mysql-bin.000002 > /opt/287.sql
#mysqlbinlog --start-position=416 /usr/local/mysql/data/mysql-bin.000002 > /opt/416.sql
删除 test 数据库
mysql>drop database test;
利用 binlog 恢复数据
#mysql -uroot -p123456< /opt/mysql-bin.000001.sql
#mysql -uroot -p123456< /opt/287.sql
#mysql -uroot -p123456< /opt/416.sql
恢复完成后,我们检查下表的数据是否完整
mysql> select * from test.tb1;
Ok 完整的都恢复过来了
mysqlbinlog 选项示例
常见的选项有以下几个:
--start-datetime 从二进制日志中读取指定时间戳或者本地计算机时间之后的日志事件。
--stop-datetime 从二进制日志中读取指定时间戳或者本地计算机时间之前的日志事件。
--start-position 从二进制日志中读取指定 position 事件位置作为开始。
--stop-position 从二进制日志中读取指定 position 事件位置作为事件截至。
2、mysqldump 介绍
mysqldump 是 mysql 用于备份和数据转移的一个工具。
它主要产生一系列的 SQL 语句,可以 封装到文件,该文件包含有所有重建你的数据库所需要的 SQL 命令如 CREATE DATABASE, CREATE TABLE,INSERT 等等。
可以用来实现轻量级的快速迁移或恢复数据库。
mysqldump 是将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适, 这也是最常用的备份方法。
mysqldump 一般在数据量很小的时候(几个 G)可以用于备份。当数据量比较大的情况下, 就不建议用 mysqldump 工具进行备份了。 数据库的导出 导出对象说明: mysqldump 可以针对单个表、多个表、单个数据库、多个数据库、所有数据库进行导出的操作
# mysqldump [options] db_name [tbl_name ...] //导出指定数据库或单个表
# mysqldump [options] --databases db_name ... //导出多个数据库
#mysqldump [options] --all-databases //导出所有
导出数据库 tes
# mysqldump -uroot -p --flush-logs test > /opt/test.sql //--flush-logs 这个选项就会完整备份
数据库的导入
# mysql -uroot -p test < /opt/test.sql
举例 删除库并恢复:
(备份)
(恢复) (如果报错 说明创建个你要创建的数据库就可以)
删除表:
(备份表)
(恢复表)
在前面我们介绍了 mysql 的 binlog 和 mysqldump 工具,下面我们来学习如何实现 mysqldump
全库备份+binlog 的数据恢复
环境准备与备份还原:
检查开启 binlog
先创建一些原始数据
mysql> reset master;
mysql> create database test_db;
mysql> use test_db;
mysql> create table tb1(id int primary key auto_increment,name varchar(20));
mysql> insert into tb1(name) values(\'tom1\');
mysql> insert into tb1(name) values(\'tom2\');
mysql> commit;
mysql> select * from tb1;
方案:mysqldump 全库备份+binlog 还原
1、mysqldump 备份方案:
每周一凌晨 1 点全库备份
2、备份步骤
(1)创建备份目录 # mkdir /opt/mysqlbackup
# mkdir /opt/mysqlbackup/daily
(2)全库备份
这里我们模拟周一的完整备份数据库任务
#mysqldump -uroot -p --flush-logs test_db > /opt/mysqlbackup/test_db_2016_09_12.sql (test_db_`date +%Y%m%d_%H%M%S`)
ls -l /opt/mysqlbackup/
-rw-r--r--. 1 root root 1871 Sep 13 21:06 test_db_2016_09_12.sql
备份 mysqldump 全库备份之前的 binlog 日志文(注:生产环境中可能不只一个 binlog 文件)
# cp /usr/local/mysql/data/mysql-bin.000001 /opt/mysqlbackup/daily/
# mysql -uroot -p -e "purge binary logs to \'mysql-bin.000002\'"
模拟下操作失误,将数据修改错误了。
mysql> use test_db;
mysql> delete from tb1 where id=1;
mysql> commit;
mysql> insert into tb1(name) values(\'tom3\');
mysql> commit;
备份自 mysqldump 之后的 binlog 日志文件
cp /usr/local/mysql/data/mysql-bin.000002 /opt/mysqlbackup/daily/
上面的模拟的误操作是删除了 id=1 的记录
(3)现在我们使用 mysqldump 的全库备份和 binlog 来恢复数据。
使用 mysqldump 的备份进行全库恢复
# mysql -uroot -p test_db < /opt/mysqlbackup/test_db_2016_09_12.sql
查询一下数据
mysql -uroot -p -e "select * from test_db.tb1"
从显示结果可以看到使用 mysqldump 备份将数据还原到了备份时的状态,刚才删除的数据 (id=2)恢复回来了,但备份后产生的数据却丢失了所以还得利用 binlog 进一步还原 因为删除是在全库备份后发生的,而 mysqldump 全库备份时使用--flush-logs 选项,所以只需 要分析全库备份后的 binlog 即 mysql-bin.000002。
mysql> show binary logs;
查看 mysql-bin.000002 中的事件,可以看到有删除事件
#mysqlbinlog -vv /opt/mysqlbackup/daily/mysql-bin.000002
通过 mysqlbinlog 命令所显示的结果可以看到误操作 delete 的开始 postion 为 219,结束 position 是 422。
从二进制日志中读取指定 position=219 事件位置作为截至,即把数据恢复到 delete 删除前
# mysqlbinlog --stop-position=219 /opt/mysqlbackup/daily/mysql-bin.000002 | mysql -u root -p
从二进制日志中读取指定 position=422 事件位置作为开始,即跳过删除事件,恢复删除事件 之后对数据的正常操作
#mysqlbinlog --start-position=422 /opt/mysqlbackup/daily/mysql-bin.000002 | mysql -u root -p
查看恢复结果: # mysql -uroot -p -e "select * from test_db.tb1"
以上是关于mysql所有备份与恢复的主要内容,如果未能解决你的问题,请参考以下文章