mysql备份类型主要有一下三种:

        热备份:备份时服务照常在线,读写都不受影响;
        温备份:备份时仅可进行读操作,需要申请锁;
        冷备份:也叫离线备份,读写操作必须中止;

       不同的存储引擎对备份的支持也是不一样的,MyISAM存储引擎可以使用LVM快照功能配合实现热备份,如果没有LVM,则只能实现温备份。而InnoDB则可以完全支持热备,可使用的热备工具有:xtrabackup, mysqldump等

根据需要备份的数据集,备份方式有以下三种:

        完全备份:备份全部需要备份的数据

        增量备份:仅备份上次完全备份或增量备份以后变化的数据

        差异备份:仅备份上次完全备份依赖变化的数据

根据备份的方法,分为物理备份和逻辑备份

        物理备份:直接cp数据文件,速度比较快;

 逻辑备份:将数据导出至文本文件中,方便使用文本处理工具直接对其处理、可移植能力强;数据量过大时备份速度很慢;

下面介绍mysqldump和snapshot用法

备份数据库中的所有库:--all-databases

[root@localhost ~]# mysqldump -uroot -hlocalhost -p --all-databases > /tmp/all.sql

    备份指定单个或多个库:--databases

[root@localhost ~]# mysqldump -uroot -hlocalhost -p --databases testdb test > /tmp/mult.sql

    为了防止备份数据库时,某个用户正在往某个表里插入数据,需要在备份数据库对所有表加锁:--lock-all-tables,其他用户的读写会被阻塞

[root@localhost ~]# mysql -uroot -hlocalhost -p --databases --lock-all-tables hellodb > /tmp/hdb.sql

其他常用选项:

     --single-transaction: 如果某个表使用的存储引擎是Innodb存储引擎,能够对存储引擎实现热备,不能与--lock-all-tables同时使用

    --events:备份事件调度器代码

    --routines:备份存储过程或存储函数代码

    --triggers:备份触发器    

    --flush-logs:备份前,请求到锁之后滚动日志

    --master-data:备份时指定二进制日志文件及位置

mysqldump的完整用法:

    1、先使用--lock-all-tables请求锁或--single-transaction进行Innodb热备

    2、滚动日志:--flush-logs

    3、指定备份的数据库:--databases

[root@localhost ~]# mysqldump -uroot -hlocalhost -p --lock-all-tables --flush-logs --databases hellodb > /tmp/hdb.sql (温备)
[root@localhost ~]# mysqldump -uroot -hlocalhost -p --single-transaction --flush-logs --databases hellodb > /tmp/hdb.sql (对Innodb存储引擎做热备)

使用mysqldump+二进制文件进行时间点恢复

    先备份testdb库

[root@localhost ~]# mysqldump -uroot -hlocalhost -p --lock-all-tables --flush-logs --databases testdb --master-data=2 > /tmp/hdb.sql

    使用vim打开/tmp/hdb.sql查看当前二进制日志位置

wKiom1NWeYjTFIkOAAHV59kalaM162.jpg

    之后在testdb数据库中再创建一个新表,加入两行数据

mysql> create table t1(Name char(30));
mysql> insert into t1 values ('lucy'),('tom');

    然后再删除testdb数据库

mysql> drop database testdb;

    查看删除testdb数据库之前的操作在二进制文件的位置

mysqlbinlog --start-position=106 mysql-bin.000002

    wKioL1NWfKGSecWTAAF9GxJJ3BU361.jpg

[root@localhost mysql]# mysqlbinlog --start-position=106 --stop-position=470 mysql-bin.000002 > /tmp/hdb.1.inc.sql

 

mysql> set session sql_log_bin=0;(进入mysql,关闭二进制文件记录)

 

mysql> source /tmp/hdb.sql(导入testdb数据库完整备份)
mysql> source /tmp/hdb.1.inc.sql(恢复至删除testdb数据之前的数据)

 

验证数据库完整备份及完整备份后的数据是否恢复

wKioL1NWfwaQRe-WAAEsNlGHwQA224.jpg