MySQL的备份与恢复

 前言:

为什么要备份?

  • 灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作;

  • 测试;


注意的要点:

  • 能容忍最多丢失多少数据;

  • 恢复数据需要在多长时间内完成;

  • 需要恢复哪些数据;

  • 做还原测试,用于测试备份的可用性;

  • 还原演练;



备份类型:

完全备份,部分备份;

  • 完全备份:整个数据集;

  • 部分备份:只备份数据子集;

  1. 增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据;

  2. 差异备份:仅备份最近一次完全备份以来变化的数据;



热备份、温备份、冷备份:

  • 热备:读写操作均可执行;

  • 温备:读操作可执行,但写操作不可执行;

  • 冷备:读写操作均不可进行;


 【MyISAM:温备,不支持热备】

 【InnoDB:支持热备】


物理备份、逻辑备份:

  • 物理备份:直接复制数据文件进行备份;

  • 逻辑备份:从数据库中“导出”数据另存而进行的备份(与存储引擎无关);


备份时需要考虑的因素:

  1. 持锁多久;

  2. 备份过程的时长;

  3. 备份负载;

  4. 恢复过程的时长;


备份内容:

  • 数据

  • 二进制日志、InnoDB的事务日志;

  • 代码(存储过程、存储函数、触发器、时间调度器);

  • 服务器的配置文件;


备份方案:

  • 数据集:完全+增量;

  • 备份手段:物理,逻辑;


     


备份工具:

  • mysqldump:逻辑备份工具,适用于所有存储引擎,温备;完全备份、部分备份;对InnoDB支持热备;

  • cp,tar等复制归档工具;物理备份工具,适用于所有存储引擎;冷备:完全备份,部分备份;

  • lvm2快照:几乎热备;借助于文件系统管理工具进行备份;

  • mysqlhotcopy:几乎冷备;仅使用于MyISAM存储引擎;


备份工具的选择:

  • mysqldump+赋值binlog:

      • mysqldump:完全备份;

      • 复制binlog中指定的时间范围的event;增量备份;    

  • lvm2快照+复制binlog:

      • lvm2快照:使用cp或tar等做物理备份;完全备份;

      • 赋值binlog中指定时间范围的event;增量备份;

  • xtrabackup:

      • 由Percona提供的支持对InnoDB做热备(物理备份)的工具;完全备份、增量备份;




mysqldump:客户端命令,通过mysql协议连接至mysql服务器

 mysqldump [options] [db_name [tbl_name ...]]


  shell> mysqldump [options] db_name [tbl_name ...]

  shell> mysqldump [options] --databases db_name ...

  shell> mysqldump [options] --all-databases    

    • 对于MyISMA表的温备,锁定数据库,而后启动备份操作:

        --lock-all-tables:锁定所有库的所有表;

        --lock-tables:对于每个单独的数据库,在启动备份之前锁定其所有表;

    • 对于InnoDB的热备:

            --single-transaction


    其他选项:

      • -E,--events:备份指定数据库相关相关的所有event scheduler;

      • -R,--routines:备份指定数据库相关的所有存储过程和存储函数;

      • --triggers:备份表相关的触发器;

      • --master-data[=#]:

  1. 记录为CHANGE MASTER TO 语句,此语句不被注释。

  2. 记录为注释的CHANGE MASTER TO语句

--flush-logs:锁定表完成后,执行flush logs命令,进行二进制日志滚动;

      (注:二进制文件不应该与数据文件放在同一磁盘)



使用mysqldump工具将数据库的时间点还原:

[root@node6 ~]# mysqldump -uroot --all-databases --lock-all-tables --master-data=2 > /tmp/all.sql  #先进行一次全量备份

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=7655;  #备份数据中会插入此行,表示从那个二进制文件的哪个地方开始备份的。

.......   #对数据库进行一番操作
[root@node6 mysql]# mysqlbinlog --start-position=7655 /data/mysql/mysql-bin.000005  #使用mysqlbinlog命令可以查看全量备份之后二进制日志记录的语句
[root@node6 mysql]# mysqlbinlog --start-position=7655 /data/mysql/mysql-bin.000005 > /tmp/incre.sql   #将全量备份之后的二进制日志保存至某一数据库文件

[root@node6 mysql]# scp /tmp/all.sql 172.16.61.8:/tmp/
[root@node6 mysql]# scp /tmp/incre.sql 172.16.61.8:/tmp/   #将备份数据文件和二进制文件复制到需要进行恢复的数据库服务器中



[root@node8 ~]# mysql < /tmp/all.sql
[root@node8 ~]# mysql < /tmp/incre.sql    #在新数据库主机中导入备份文件和二进制文件,此时该数据库就恢复到了之前数据库误操作之前的状态

注:进行还原操作时需把二进制功能关闭,防止生成还原数据库事件,还原完成后再打开二进制日志功能;



基于lvm快照的方式进行备份

[root@node6 mysql]# lvcreate -L +5G -n mylv centos      #创建一个逻辑卷
  Logical volume "mylv" created.
[root@node6 mysql]# mke2fs -t ext4 /dev/centos/mylv     #格式化文件系统

[root@node6 ~]# mount /dev/centos/mylv /mydata          #挂载至mydata目录
[root@node6 mydata]# mkdir mysql                        #创建mysql目录并修改权限
[root@node6 mydata]# chown -R mysql.mysql mysql/

datadir = /mydata/mysql                       #在mariadb的配置文件中加入该项

[root@node6 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/mysql/  #在mariadb安装目录下执行初始化

MariaDB [test]> set sql_log_bin=0;        #连入mariadb关闭二进制日志功能;
MariaDB [test]> source /tmp/all.sql       #导入先前所备份的全部数据库;
MariaDB [test]> set sql_log_bin=1;        #完成后再次打开二进制日志功能;

  
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;  #对表加读锁;
 
MariaDB [(none)]> FLUSH LOGS;                   #手动滚动日志;

MariaDB [(none)]> SHOW MASTER STATUS\G;         #记录二进制日志位置;
*************************** 1. row ***************************
            File: mysql-bin.000004
        Position: 245
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)
 
[root@node6 ~]# lvcreate -L 500M -s /dev/centos/mylv -n mysql-snap -p r   #创建快照卷;
  Logical volume "mysql-snap" created.
[root@node6 mysql]# mkdir -pv /backup/`date +%F`         #创建备份目录
mkdir: 已创建目录 "/backup"
mkdir: 已创建目录 "/backup/2016-03-16"

[root@node6 mysql]# cp -a * /backup/2016-03-16/       #复制数据到备份目录中
[root@node6 mysql]# ls /backup/2016-03-16/
aria_log.00000001  ib_logfile0       mysql-bin.000002  node6.tz.com.err
aria_log_control   ib_logfile1       mysql-bin.000003  node6.tz.com.pid
hellodb            mysql             mysql-bin.000004  performance_schema
ibdata1            mysql-bin.000001  mysql-bin.index   test

[root@node6 ~]# umount /mnt               #释放快照卷
[root@node6 ~]# lvremove /dev/centos/mysql-snap  #删除快照卷
Do you really want to remove active logical volume mysql-snap? [y/n]: y
  Logical volume "mysql-snap" successfully removed
  
......            #对数据库一顿操作....



[root@node6 ~]#  mysqlbinlog --start-position=245 /mydata/mysql/mysql-bin.000004 > /root/bak.sql  #导出备份时间之后的二进制日志

[root@node6 mysql]# rm /mydata/mysql/* -fr     #删除数据库文件

[root@node6 mysql]# cp -a /backup/2016-03-16/* /mydata/mysql/    #复制备份文件至数据目录中
[root@node6 mysql]# ll /mydata/mysql/     #确认文件的权限为mysql用户
[root@node6 mysql]# systemctl start mariadb   #启动数据库之后查看数据都在,但备份之后做出的修改没有还原

MariaDB [hellodb]> source /root/bak.sql   #导入之前备份的二进制日志文件,发现我们修改过的数据也被还原







你可能感兴趣的:(数据库的备份与恢复)