MySQL备份通常采用全库备份加日志备份的方式,根据业务的须要,能够采用每周日凌晨1点进行彻底备份以及每小时进行一次增量备份,这样在MySQL故障后可使用彻底备份和日志备份尽量的去恢复最完整的数据。
1、binlog日志恢复
MySQL的二进制日志记录着该数据库全部增删改的操做日志(前提是须要本身开启binlog),还包括了这些操做的执行时间,binlog的使用场景无外乎就是主从同步以及恢复数据库。开启binlog功能,须要编辑MySQL的主配置文件,以下:
一、查看二进制功能是否开启(以下,值为OFF,则表示未开启):mysql
mysql>show VARIABLES like 'log_bin';
二、开启二进制日志功能:sql
[root@mysql ~]# vim /etc/my.cnf #在mysqld字段下写入下面配置,以便开启二进制日志并指定二进制文件名 #开启二进制日志,须要指定server-id,不然服务将会启动失败 log-bin=/usr/local/mysql/data/bin_log server-id=1 [root@mysql ~]# systemctl restart mysqld #重启后,将在指定的目录下生成两个文件,以下: [root@mysql data]# pwd /usr/local/mysql/data [root@mysql data]# ls | grep bin_log bin_log.000001 #每次重启mysql服务或执行flush logs命令,都会生成一个新的这样的文件,依次为00000一、000002...... bin_log.index #这个文件存储全部二进制文件的索引
开启二进制日志功能后,全部增删改的操做都会记录到二进制日志文件当中,注意,是增删改的操做,不包括查操做。
三、肯定二进制日志功能已开启数据库
mysql>show variables like 'log_bin';
四、执行增删改以便测试bin_log是否有记录vim
mysql> reset master; #清空全部的二进制文件,从00001开始 #建立一个库,并在库中建立一个表 mysql> create database test1; mysql> use test1; mysql> create table tb1(id int primary key auto_increment,name varchar(20)); #向表中插入两条数据 mysql> insert into tb1(name) values('zhangsan'); mysql> insert into tb1(name) values('lisi'); #从新开始一个新的日志文件再执行操做。注意,此时上面全部的操做写入的是第一个二进制日志文件 mysql> flush logs; mysql> delete from tb1 where name='lisi'; #删除插入的第二条数据 mysql> insert into tb1(name) values('tom'); #再插入一条新的数据 #以上的操做是写入了第二个日志文件
五、MySQL中查看二进制日志文件及文件内容
查看二进制日志文件:ide
mysql>show binary logs;
查看二进制日志文件内容:
完整的命令格式以下:工具
SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] # in:指定要查看的二进制文件; # from:指定从哪一个“pos”位置开始查看 # limit:限制返回的行数,offset是指跳过多少行再显示
注:若是不指定二进制文件名,那么默认显示第一个二进制日志文件中的事件,文件内容中包含了日志文件名、事件的开始位置、事件类型、结束位置、信息等内容。post
mysql>show binlog events in 'bin_log.000001';
其余命令:测试
- show master logs:也是查看二进制日志文件;
- PURGE BINARY LOGS:用于删除二进制文件;
.优化
例子:rest
- PURGE BINARY LOGS TO 'mysql-bin.00010'; #把这个文件以前的其余文件都删除掉
- PURGE BINARY LOGS BEFORE '2016-08-28 22:46:26'; #把指定时间以前的二进制文件删除了
六、使用mysqlbinlog本地查看二进制日志内容
[root@mysql data]# pwd /usr/local/mysql/data [root@mysql data]# mysqlbinlog bin_log.000001 #使用-v选项能够查看出日志文件中的详细信息,两个v能够查看出更详细的信息,可是三个vvv也不会有什么做用了 [root@mysql data]# mysqlbinlog -v bin_log.000001 [root@mysql data]# mysqlbinlog -vv bin_log.000001
七、经过二进制日志恢复数据
假设在开始删除lisi记录的那条sql语句是误操做,如今要经过二进制日志来恢复数据。
1)首先须要找到删除lisi记录的sql语句在二进制日志中的位置,每条sql语句都是一个事务,因此须要从其begin到commit,才算是完整的sql语句。以下:
[root@mysql data]# mysqlbinlog -v bin_log.000002 | tail -35
从上面能够看出,delete事件发生position是387,事件结束是650。
2)事件恢复流程:直接用bin-log日志将数据库恢复到删除位置219前,而后跳过故障点,再进行恢复下面全部的操做,具体恢复流程以下:
导出相关binlog文件(将二进制文件转换为sql语句生成新的文件):
[root@mysql data]# mysqlbinlog bin_log.000001 > /tmp/01.sql [root@mysql data]# mysqlbinlog --stop-position=387 bin_log.000002 > /tmp/387.sql [root@mysql data]# mysqlbinlog --start-position=650 bin_log.000002 > /tmp/650.sql
上述指令中,第一条比较好理解,无非就是使用msyqlbinlog查看第一个二进制文件,并生成新文件,后面两条指令呢,--stop-postition意思是查看时到219这个位置不查看,一直到393才又开始接着查看。最后的结果就是新生成的文件中不会包含删除lisi记录的sql语句。
3)删除数据库
mysql> drop database test1;
4)利用binlog恢复数据
[root@mysql data]# mysql -uroot -p123 < /tmp/01.sql [root@mysql data]# mysql -uroot -p123 < /tmp/387.sql [root@mysql data]# mysql -uroot -p123 < /tmp/650.sql
5)肯定数据已恢复
mysql> select schema(); mysql> select * from tb1;
2、mysqldump备份工具
mysqldump是mysql用于备份和数据转移的一个工具。主要产生一系列的SQL语句,能够封装到文件,该文件包含有全部重建数据库所须要的 SQL命令,如CREATE DATABASE,CREATE TABLE,INSERT等等。能够用来实现轻量级的快速迁移或恢复数据库。 mysqldump 是将数据表导成 SQL 脚本文件,在不一样的 MySQL 版本之间升级时相对比较合适,这也是最经常使用的备份方法。 mysqldump通常在数据量很小的时候(几个G)能够用于备份。当数据量比较大的状况下,就不建议用mysqldump工具进行备份了。
mysqldump能够针对单个表、多个表、单个数据库、多个数据库、全部数据库进行导出的操做。
mysqldump使用示例:
一、备份某一个表
[root@mysql backup]# mysqldump -uroot -p123 mysql user > mysql-user.sql #备份mysql库中的user表 [root@mysql backup]# ls mysql-user.sql
二、恢复mysql数据库中的user表
[root@mysql backup]# mysql -uroot -p123 mysql < mysql-user.sql
三、备份mysql库
[root@mysql backup]# mysql -uroot -p123 --databases mysql > mysql.sql [root@mysql backup]# ls mysql.sql mysql-user.sql
四、恢复mysql库
[root@mysql backup]# mysql -uroot -p123 < mysql.sql
五、备份全部的库(当导出的数据量较大时,能够添加“--opt”选项以优化执行速度)
[root@mysql backup]# mysqldump -uroot -p123 --opt --all-databases > all-data.sql [root@mysql backup]# ls all-data.sql