mysql是逻辑备份工具:基于mysql客户端协议,可以远程实现,远程备份,要考虑到磁盘I/O,建议同一库中不用使用多个引擎的原因之一是备份工具支持度不一样

完全备份、部分备份;

    InnoDB:热备或温备;

    MyISAM:温备;

二次封装工具:

mydumper:perl脚本,实现模拟并行备份的效果,占用服务器的IO

phpMyAdmin

备份机制是备份时先创建数据库,然后创建表,最后在通过insert into插入所有数据

mysqldump备份机制:先创建一个库,然后在创建相关表,最后往表里插入数据

库:create  database

表:create table

数据:insert  into,使用一个insert into语句就可以把表的数据都插入,完成恢复。每一张表都要先create table,然后insert into进行恢复

执行myslqdump会把所有的内容都现在在屏幕上,然后在一步步操作,显示的结果里面可以看到具体的操作,如果要恢复,需要将这些显示结果重定向到一个文件,利用新生成的文件进行恢复

mysqldump用法,有三个,如下: 

方法一:

mysqldump [OPTIONS] database [tables]   # 备份单库,可以只备份其中的一部分表(部分备份);

方法二:

mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]  # 备份多库;,建议用这个方式实现,即使备份单个库,因为不用自己创建库

例子:

[root@CentOS7E ~]#mysqldump -u root -pPass123456 -h 192.168.1.71 --databases sunny
 执行语句后,会把sunny这个数据库的内容都打印到屏幕上,此时没有重定向到相关文件,不能用于恢复,但是可以查看使用mysqldump命令过程执行的操作。
 方法三:
  mysqldump [OPTIONS] --all-databases [OPTIONS] # 备份所有库;也是自己创建库

注意,执行备份时,要添加选项,将对应的表锁住,防止时间点不一致,不能用于还原数据

MyISAM存储引擎:支持温备,备份时要锁定表;

-x, --lock-all-tables:锁定所有库的所有表,读锁;锁定范围大。

-l, --lock-tables:锁定指定库所有表;备份哪个表的时候就只锁定对应的表

InnoDB存储引擎:支持温备和热备;

可以使用-x或者-l来实现温备

--single-transaction:创建一个事务,基于此快照执行备份,实现热备;但是问题是如果备份时的一些事物没有被commit或者回滚,导致恢复数据有问题,所以恢复的时候还要执行崩溃的恢复,因此还要借助崩溃后的恢复操作,实现数据的完整。

其它选项:

-R, --routines:备份指定库的存储过程和存储函数;

--triggers:备份指定库的触发器;

-E, --events:  

例子

利用mysql实现数据备份和还原

热备,添加相关的选项,并重定向到文件/root/sunny.sql

[root@CentOS7E sunny]#mysqldump -u root -pPass123456 -h 192.168.1.71 --single-transaction -R --triggers -E --databases sunny > /root/sunny.sql

例子:利用重定向,将生成的文件恢复到本地的mysql库里,如果本地已经有数据库,就不会创建重名的数据库,直接新建表,将数据导入新建的表里。

注意,恢复前,将恢复的本地服务器的二进制日志关闭,否则,新导入的数据会被记录到二进制日志中,但是这部分日志是恢复的文件,不需要进行再次记录

关闭二进制日志功能如下

MariaDB [sunny]> set @@session.sql_log_bin=off;
恢复数据库
[root@CentOS7E ~]#mysql -uroot -pPass1234 </root/sunny.sql  
恢复备份的时候,还有一小部分是没有备份到备份文件中的,因此,需要用二进制文件来重放进行恢复,因此做全量备份的时候,要结合选项--master-data和--flush-logs
 --master-data[=#]

1:记录为CHANGE MASTER TO语句,此语句不被注释;

2:记录为CHANGE MASTER TO语句,此语句被注释;一般是设置为2 

--flush-logs:锁定表完成后,即进行二进制表的日志刷新操作;驱动服务器日志滚动

例子:

[root@CentOS7E ~]#mysqldump -u root -pPass1234 -h 192.168.1.71 --single-transaction -R --triggers -E --databases sunny --master-data=2 --flush-logs > /root/sunny-$(date +%F-%H-%M-%S).sql
[root@CentOS7E ~]#less  sunny-2018-01-15-13-10-17.sql
查看新生成的备份文件,有如下的关键的注释信息如下,
恢复的时候可以从master-log.000005这个文件的第245字节开始恢复,因为上次备份时有CHANGE MASTER TO=2,上次有滚动,恢复的时候只要把245之后的内容拿来重放就可以
-- CHANGE MASTER TO MASTER_LOG_FILE='master-log.000005', MASTER_LOG_POS=245;
假设此时在服务器71上的sunny数据库进行操作,则新生成的日志将记录到二进制日志master-log.000005,假设71上操作如下
MariaDB [sunny]> delete from students where id=1000;
MariaDB [sunny]> delete from students where id=1002;
MariaDB [sunny]> insert into students(id,name,age,gender) values (1050,"new005",18,"M");
此时,在71的master-log.000005会记录这些新生成的日志,查看如下
[root@CentOS7A mysql]#mysqlbinlog /mydata/log/master-log.000005

恢复到75这台刚才导入全量备份的mysql服务器上

恢复操作如下

首先,将master-log.000005这个文件进行重定向恢复,然后拷贝到75上进行重放

重定向,mysqlbinlog这个工具读取数据后会转换成sql语句,注意,这里-j 245可以不指定,因为245字节前没有有效内容,如果是245之后开始的,注意要添加-j选项

[root@CentOS7A mysql]#mysqlbinlog -j 245  /mydata/log/master-log.000005 >/tmp/binlog005.sql
拷贝数据
[root@CentOS7A mysql]#scp /tmp/binlog005.sql 192.168.1.75:/root/
在75上将binlog005.sql重新导入数据库
[root@CentOS7E ~]#mysql -uroot -pPass123456 < binlog005.sql

注意,将来用mysqldump做备份的时候,建议把二进制文件也拷贝一份出来,用于异常备份,将来备份的时候,用mysqlbinlog命令读出来生成mysql语句的文件,然后再进行二进制文件的恢复。不过mysqldump恢复效率低,建议使用xtrabackup这个工具来实现


转载于:https://blog.51cto.com/ghbsunny/2064493