mysql备份与还原

mysql备份与还原
备份:副本,备份的目的是为了防止数据丢失或者数据库出现问题时,进行恢复(备份存放在另一个盘)
备份类型:
    热备份、温备份和冷备份
        热备份:读写不受影响
        温备份:仅可以执行读操作
        冷备份:离线备份,读写操作均中止
    物理备份与逻辑备份
        物理备份:复制数据文件
        逻辑备份:将数据导出至文本文件中
    完全备份、增量备份和差异备份
        完全备份:备份全部数据
        增量备份:仅备份上次完全备份或增量备份以后的变化的数据
        差异备份:仅备份上次完全备份以后的变化的数据
还原:
    备份什么:以Mysql为例
        数据、配置文件、二进制日志(用于即时点还原)、事务日志
    
热备份:
    MyISAM:温备份
    InnoDB:xtrabackup,mysqldump
Mysql
    物理备份:速度快
    逻辑备份:速度慢、丢失浮点数精度,方便使用文本处理工具直接对其处理、可移植能力强
备份策略:完全+增量;完全+差异

Mysql备份工具
    mysqldump:逻辑备份工具,MyISAM(温)、InnoDB(热)
    mysqlhotcopy:物理备份工具、温备份
    
文件系统工具
cp:冷备    
lv:逻辑卷的快照功能,几乎热备
    mysql>FLUSH TABLES;
    mysql>LOCK TABLES

一、mysqldump工具使用    
mysqldump直接备份与还原    (mysqldump DB_name [tb1] [tb2]可以备份单个数据库或表)
[root@shitouji ~]# mysqldump -uroot -p students >students.sql    

[root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs blog wp_options --single-transaction >/boot/wp_options.sql        #备份指定库某张表

  • 单张表的备份可以使用select * into outfile '存放路径及名称' from 表名     #select * into outfile '/root/test.txt' from test;
  • 还原时使用load data infile '存放路径及名称' into table 表名    #load data infile '/root/test.txt' into table test;

[root@shitouji ~]# ls
jiaowu.sql  mysql-community-5.7.21-1.el7.src.rpm  rpmbuild  sh  sources  students.sql

[root@shitouji ~]# mysql test < students.sql 

[root@shitouji ~]# mysql -uroot -p 库名< students.sql 

问:如果备份时,有其它用户在进行写时,会带来什么问题?
    会带时间点的不一致
    因此,要进行加锁,并且进行二进行日志滚动(滚动日志,备份时才知道从什么时候开始时行)
    
--master-data={0|1|2}
    0:不记录二进制日志文件及路位置
    1:以CHANGE MASTER TO 的方式记录位置,可用于恢复后直接启动从服务
    2:以CHANGE MASTER TO 的方式记录位置,但默认是注释的
    
--lock-all-tables:锁定所有表
--flush-logs:执行日志flush

如果指定库中的表类型均为INNODB,可使用--single-transaction启动热备
    
备份多个库
    --all-databases:备份所有库
    --databases DB_NAME,DB_NAME,...:备份指定库
    
    --events
    --routines
    --triggers
    
备份策略:每周完全+每天增量
    完全备份:mysqldump
    增量符合:备份二进制日志文件(先执行flush logs进行日志滚动)
[root@shitouji data]# mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > /boot/alldata.sql    
Enter password: 
[root@shitouji data]# mysqlbinlog mysql-bin.000001 > /boot/1.sql      #二进制日志备份

如果库中所有的表都是Innodb引擎,则可以进行热备份

show table status;      #查看库中所有表的信息(包括表的所用引擎)

[root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs --databases blog --single-transaction >/boot/blog.sql

#使用--single-transaction选项时,不需要再使用 --lock-all-tables来锁定表,--single-transaction选项会自动进行锁定,在备份时,保存的文件最好是有时间格式/boot/blog`date +%F%H%M%S`.sql

还原操作

[root@shitouji shitouji]# mysql -uroot -p < blog.sql          #备份库还原

二、基于LVM快照备份

前提,数据要在逻辑卷上,且逻辑卷所在的卷组必须有足够的空间使用快照,.数据文件和事物日志要在同一个卷上。

原理:LVM中snapshot通过“写时复制”(copy on write) 来实现,即当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data);创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里。

操作步骤:

  • 打开会话,施加读锁,锁定所有表
    • mysql>flush tables  with read lock;
    • mysql>flush logs;
  • 通过另一个终端,保存二进制日志文件及相关位置信息
    • $mysql -uroot -p -e ‘show master status\G;’ > /path/to/master.info
  • 创建快照卷
    • #lvcreate -L 50M -s -p r -n lv_name  /path/to/source_lv
    • -s|--snapshot:指定创建快照
    • [-p|--permission {r|rw}]:设定创建的快照具有被读或读写特性
    • -n:指定快照名字
  • 释放锁
    • mysql>unlock tables;
  • 挂载快照卷,备份
    • $mount  /path/to/lv_name  /mnt
    • $cp -a /mysql/*  /backup/full-backup
  • 删除快照卷
    • umount /mnt
    • lvremove --froce /path/to/lv_name
  • 增量备份二进制日志
    • $cat  /path/to/master.info;查看当前二进制日志位置
    • $mysqlbinlog --start-position=107 mysql-bin.000005 >/backup/bak.sql
    • 当一个事务跨越不同的二进制文件时,开启通过时间备份--start-datetime
    • $mysqlbinlog --start-datetime=’2016-05-06 14:55:34’ mysql-bin.00005 mysql-bin.000006 > /backup/bak-`date +%F-%H-%M-%S`.sql

还原:

  • $cp -a  /backup/fullbak  /mysql 注意mysql目录下的文件属主是mysql
  • $/etc/init.d/mysqld restart
  • mysql>set sql_log_bin=0;关闭二进制日志
  • mysql>source /backup/bak-`date +%F-%H-%M-%S`.sql;还原数据
  • mysql>set sql_log_bin=1;

xtrabackup工具

xtrabackup 常用选项

  • --user =root  #使用什么用户
  • --password=     #用户密码
  • --port=      #端口号
  • --socket=     #套接字
  • --target-dir=name   #指定备份路径
      --backup   #与--target-dir
  • --copy-back

注意事项,mysql5.7后xtrabackup工具得使用2.4版本及以上,mariadb10.3版本以上,不支持xtarbackup工具,可以使用mariabackup工具

备份innobackupex --port=3306 --socket=/tmp/mysql.sock --user=root --datadir=/app/mysqldb /home/backup

xtrabackup使用参照https://www.cnblogs.com/imweihao/p/7290026.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章