MySql 数据库的备份与恢复(一)

用到的软件包在百度网盘中

链接:https://pan.baidu.com/s/1--klDCt3afjt9QSPBS0lGA?pwd=sxau 
提取码:sxau

一,相关概念

数据备份:就是把当前服务器上的数据拷贝一份,放到其他的存储设备里

恢复数据: 使用放到其他存储设备里的备份数据,还原丢失的数据。

数据备份方式:

          物理备份:拷贝数据库目录下的文件

          逻辑备份:使用软件提供的备份命令对数据做备份

数据备份策略 :

        1、完全备份 :备份所有数据, 一台数据库服务器上的所有数据, 一个数据库下所有数据 一张表里的所有数据。

        2,增量备份:备份上次备份后,新产生的数据

        3、差异备份:备份自完全备份后,新产生的数据。

备份策略的使用方式:

        完全备份+增量备份

        完全备份+差异备份

二、完全备份

2.1、物理方式对数据做备份与恢复

适合线下数据库服务器(需要停止数据库服务)

# 备份数据
[root@host50 ~]# systemctl  stop   mysqld 
[root@host50 ~]# mkdir  /bakdir
[root@host50 ~]# cp -r /var/lib/mysql  /bakdir/mysql.bak   拷贝数据库目录

[root@host50 ~]# cd /var/lib/mysql
[root@host50 ~]# tar -zcf  /bakdir/mysql.tar.gz ./*   打包压缩数据库目录下文件


# 查看备份文件
[root@host50 ~]# ls /bakdir/
mysql.bak    mysql.tar.gz
[root@host50 ~]# 


# 模拟数据丢失
[root@host50 ~]# rm -rf /var/lib/mysql/*

# 恢复数据
[root@host50 ~]# cp -r /bakdir/mysql.bak/* /var/lib/mysql/
[root@host50 ~]# chown -R mysql:mysql /var/lib/mysql
[root@host50 ~]# systemctl  start mysqld
[root@host50 ~]# mysql -uroot -p密码
mysql> show  databases;   # 能够看所有的库

2.2、逻辑方式对数据备份与恢复

  • 适合线上数据库服务器,备份和恢复数据库服务必须是运行的

# 完全备份命令 
]# mysqldump   -uroot    -p密码   库名   >  /目录名/备份文件名.sql
库名的表示方式:
		 库名  表名                     #备份库中一张表的所有数据	
		 库名  表名1   表名2            #备份多张表的所有数据
	     -B  库名                      #备份1个库的所数据
		 -B  库名1     库名2            #备份多个库的所数据
		 -A  或   --all-databases      #备份服务器的所有数据

# 完全恢复数据命令 
]# mysql   -uroot    -p密码   [库名]  <  /目录名/备份文件名.sql
说明:使用表的备份文件恢复数据时必须写库名,
不然数据库服务不知道把数据恢复那个库里


# 备份数据例子
# 存储备份文件的目录要事先创建
--master-data 做完全备份数据时 ,在备份文件里记录使用的日志名和偏移量

[root@host52 ~]# mysqldump -uroot -pNSD2107...a --master-data -B db1 > /root/db1.sql

[root@host52 ~]#grep master52 /root/db1.sql 
CHANGE MASTER TO MASTER_LOG_FILE='master52.000001', MASTER_LOG_POS=2000;



[root@host50 ~]# mysqldump -uroot -p密码  tarena salary > /bakdir/tarena_salary.sql

[root@host50 ~]# mysqldump -uroot -p密码  -B  tarena > /bakdir/tarena.sql

[root@host50 ~]# mysqldump -uroot -p密码  -B db1 tarena > /bakdir/twodb.sql

[root@host50 ~]# mysqldump -uroot -p密码  -A > /bakdir/allbak.sql

[root@host50 ~]# ls /bakdir/
allbak.sql  tarena.sql  tarena_salary.sql    mysql.bak  mysql.tar.gz  twodb.sql

# 恢复数据例子
# 删除数据
mysql> delete from  tarena.salary;
mysql> exit

# 恢复数据
[root@host50 ~]# mysql -uroot -p密码 tarena < /bakdir/ tarena_salary.sql

# 查看表记录
[root@host50 ~]# mysql -uroot -p密码
Mysql> select count(*)  from  tarena.salary;

# 使用库的备份文件恢复数据
mysql> drop database tarena;
mysql> exit;

#使用库的备份文件恢复数据 不需要写库名
[root@host50 ~]# mysql -uroot -p密码  < /bakdir/tarena.sql    

# 管理员登陆查看数据
[root@host50 ~]# mysql -uroot -p密码 
mysql> show  databases;
mysql> use  tarena;
mysql> show tables;


# 编写计划任务每周周一晚上23点备份服务的所有数据 用系统日期做备份文件名
# 编写备份脚本
vim  /root/allbak.sh
#!/bin/bash
mysqldump -uroot -p密码  -A  > /bakdir/`date +%F`allbak.sql  
:wq

Chmod  +x  /root/allbak.sh

]#crontab  -e
00  23  * *  1   /root/allbak.sh


# mysqldump的备份缺点:  
		 1 mysqldump 在备份数据和恢复数据的时候会锁表  
	     2  使用 mysqldump备份命令生成备份文件恢复数据,
只能把数据恢复备份时刻的数据。
# 锁表 数据库备份需要时间,在备份的过程中,对数据库的查询、和存储都无法进行,
要等到表的数据备份完成,然后进行释放,释放成功后,才可以进行数据的查询和存储

三、增量备份

使用第三方软件 percona 提供的备份命令 innobackupex 对数据做备份和恢复

特点:在线热备不锁表 适合生产环境下备份业务。

第一步:安装提供命令的软件(软件需要自己下载)

]#yum -y install libev-4.15-1.el6.rf.x86_64.rpm 
]#yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm

]#which  innobackupex
/usr/bin/innobackupex

]# innobackupex  --help
]# man innobackupex  按q 退出帮助

3.1 数据增量备份与恢复

  • 说明增量备份是备份上次备份后新产生的数据 所以在执行增量备份之前 必须要先有一次完全备份 不然的话无法得知那些数据是新数据 通常增量备份前的首次备份 是 完全备份 比如 每周的周一都对数据做完全备份 每周的周二到周日 对数据都做增量备份

首次完全备份命令

]#innobackupex   -uroot     -p密码   /备份目录名  --no-timestamp

--no-timestamp    不用时间戳创建子目录存储备份数据

增量备份命令

]#innobackupex   -uroot     -p密码   --incremental   /目录名   --incremental-basedir=/目录名   --no-timestamp 

# 命令选项解释
--incremental  增量备份 
--incremental-basedir=/目录名   # “目录名”是上次备份目录,作为此次增量备份的参考

增量恢复命令

 #准备恢复数据
  ]#innobackupex   --apply-log   --redo-only   /首次备份目录名 
  
  #合并数据 (合并的顺序要与增量备份的顺序一致) 
  ]#innobackupex   --apply-log   --redo-only   /首次备份目录名   --incremental-dir=/目录名 
  
  #拷贝数据
  ]#innobackupex   --copy-back /完全备份目录
  
 
  --apply-log   --redo-only    准备恢复数据
  --incremental-dir	      增量备份数据存放目录
  --copy-back        拷贝数据到数据库目录下

增量恢复数据具体操作步骤

1) 停止数据库服务 ​

2) 清空数据库目录 ​

3) 准备恢复数据 ​

4) 合并准备恢复数据 ​

5) 恢复数据

​ 6) 修改数据库目录的所有者和组用户为mysql ​

7) 启动服务 ​

8) 查看数据

增量备份的例子

  • 统一在 host50(192.168.88.50) 主机做练习

  • 每周的周一对数据做完全备份 每周的周二到周日对数据做增量备份

# 周一 执行完全备份
[root@host50 ~]# innobackupex -uroot -p密码  /fullbak  --no-timestamp

# 向表里添加新数据 (多执行几遍)
 mysql> insert into tarena.user(name,shell) values("fff","fff"); 

# 周二  执行增量备份
[root@host50 ~]# innobackupex -uroot -p密码  --incremental  /new1dir  --incremental-basedir=/fullbak  --no-timestamp

# 向表里添加新数据  多执行几遍 
mysql> insert into tarena.user(name,shell)  values("zzz","zzz"); 

# 周三  执行增量备份
[root@host50 ~]# innobackupex -uroot -p密码  --incremental  /new2dir  --incremental-basedir=/new1dir  --no-timestamp

# 向表里添加新数据  
mysql> insert into tarena.user(name,shell)  values("www","wwww"); (多执行几遍)

# 周四  执行增量备份
[root@host50 ~]# innobackupex -uroot -p密码  --incremental  /new3dir  --incremental-basedir=/new2dir --no-timestamp

增量恢复

  • (使用增量备份文件恢复数据)

    模拟数据丢失

[root@host50 ~]# mysql -uroot -pNSD2107...a  -e 'drop database tarena'

[root@host50 ~]# mysql -uroot -pNSD2107...a  -e 'drop database mysql'

具体操作步骤:

1) 停止数据库服务  
[root@host50 ~]# systemctl  stop mysqld

2) 清空数据库目录 
[root@host50 ~]# rm  -rf /var/lib/mysql/*

3) 准备恢复数据 (告诉程序innobackupex从什么位置开始合并数据)
[root@host50 ~]# innobackupex --apply-log --redo-only /fullbak/  # 从第一次完全备份目录开始



4) 合并数据

# 合并第1次增量备份数据
[root@host50 ~]# innobackupex --apply-log --redo-only /fullbak/	
--incremental-dir=/new1dir   

# 合并第2次增量备份数据
[root@host50 ~]# innobackupex --apply-log --redo-only /fullbak/	
--incremental-dir=/new2dir   

# 合并第3次增量备份数据
[root@host50 ~]# innobackupex --apply-log --redo-only /fullbak/  
--incremental-dir=/new3dir 


5) 恢复数据  (把合并后的数据拷贝到数据库目录下)
[root@host50 ~]# innobackupex --copy-back /fullbak

6) 修改数据库目录的所有者和组用户为mysql
[root@host50 ~]# chown -R mysql:mysql /var/lib/mysql					

7)  启动服务
[root@host50 ~]# systemctl  start mysqld

8)查看数据 
[root@host50 ~]# mysql -uroot -p密码 
MySQL> show databases;		

差异备份

  • 首先要有一个完全备份

  • 与完全备份相比较,进行的备份

# 周一 执行完全备份
[root@host50 ~]# innobackupex -uroot -p密码  /fullbak  --no-timestamp

# 向表里添加新数据 (多执行几遍)
 mysql> insert into tarena.user(name,shell) values("fff","fff"); 

# 周二进行差异备份,与完全备份进行比较
[root@host50 ~]# innobackupex -uroot -p123qqq...A  --incremental /new1dir  --incremental-basedir=/fullbak  

# 周三进行差异备份 与完全备份进行比较
[root@host50 ~]# innobackupex -uroot -p123qqq...A --incremental /new2dir  --incremental-basedir=/fullbak


#备份恢复和增量备份操作步骤一样,差异备份每次备份都是和第一次的完全备份进行比较,所以,差异备份方式,恢复数据时,第一次的完全备份和最后一次的差异备份合并,得到的就是完整的数据,增量备份,都是和上一次的数据进行比较,所以合并数据时,需要将完全备份开始后的每次增量备份,全部合并才能得到完整数据。

以上备份都可以写作脚本,添加到计划任务中,进行备份执行

猜你喜欢

转载自blog.csdn.net/ysy910203/article/details/128206658