MySQL ---- 数据的备份与恢复
一: 数据备份的重要性
-
在生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果
-
造成数据丢失的原因:
-
程序错误
-
人为错误
-
计算机失败
-
磁盘失败
-
灾难和偷窃
二:数据库备份的分类
1、从物理与逻辑的角度
- 物理备份:对数据库操作系统的物理文件(如 数据文件、日志文件等)的备份。
【 物理备份分为:脱机备份(冷备份)和 联机备份(热备份)】
— 冷备份:是在关闭数据库的时候进行
— 热备份:数据库处于运行状态,依赖于数据库的日志文件
- 逻辑备份 :对数据库逻辑组件(如 表等数据库对象)的备份。
2、从数据库的备份策略角度
- 完全备份:每次对数据进行完整的备份
优点:备份与恢复操作简单方便
缺点:数据存在大量的重复 ; 占用大量的备份空间 ; 备份与恢复时间长
- 差异备份:备份那些自从上次完全备份之后被修改的文件
优点:只需备份差异
缺点:数据冗余,占用空间率较大
- 增量备份:只有那些在上次完全备份或增量备份后被修改的文件才会备份
优点:没有重复数据,备份量不大,时间短
缺点:恢复麻烦,需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复
三:MySQL数据库备份可采用多种方式
-
直接打包数据库文件夹, 如 /usr/local/mysql/data
-
使用专用备份工具 mysqldump
-
#### mysqldump 命令
-
MySQL自带的备份工具,相当方便对MySQL进行备份
-
通过该命令工具可以将指定的库、表或全部的库导出为SQL脚本,在需要恢复时可进行数据恢复
1、mysqldump 命令 对单个库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] [数据库名] > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p ku > /opt/ku.sql
2、对多个库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --databases 库名1 [库名2]... > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p --databases ku mysql > /opt/ku_mysql.sql
3、对所有库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p --opt --all-databases > /opt/all.sql
4、使用mysqldump 备份表
mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p ku biao > /opt/ku_biao.sql
5、对某个表结构的备份
mysqldump -u 用户名 -p [密码] [选项] -d 数据库名 表名 > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p -d ku a > /opt/ku_a.sql
在/opt/下 查看,有以上备份的文件名
四:恢复数据库 、表
-
使用mysqldump 命令导出的SQL备份脚本,在进行数据恢复时可使用以下方法导入:
-
source 命令
-
mysql 命令
-
使用source恢复数据库的步骤
-
登录到mysql 数据库
-
执行source 备份sql脚本的路径
1、使用mysql 命令恢复数据
mysql -u 用户名 -p [密码] < 库备份脚本的路径 ‘ < 表示导入’
示例:
基于mysql 命令进行恢复:
[root@localhost ~]# mysql -uroot -p ku < /opt/ku.sql
基于source 脚本恢复:
2、恢复表
-
恢复表时同样可使用 source 或 mysql 命令进行
-
source 恢复表的操作与恢复库的操作相同
-
当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在
五:MySQL 增量备份 、增量恢复
1、增量备份
-
MySQL没有提供直接的增量备份方法
-
可以通过MySQL提供的二进制日志 (binary logs) 间接实现增量备份
-
MySQL二进制日志对备份的意义
-
二进制日志保存了所有更新或者可能更新数据库的操作
-
二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
-
只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些旧的日志保存到安全的地方就完成了一个时间段的增量备份
-
增量备份依赖二进制日志文件,首先需要开启二进制日志文件: 进入/etc/my.cnf , 添加 log-bin=mysql-bin
[root@localhost ~]# vim /etc/my.cnf
刷新所有日志后生成一个新的日志文件 就是 增量备份日志文件 mysql-bin.00002
修改一些数据
刚刚增加、删除的信息都存放在00002 日志文件中,进行查看
用64位解码器输出 按行读取 ,并放在/opt下命名为rizhi.txt 。( -v 显示出来 ) 进入rizhi.txt看刚刚修改的数据
2、增量恢复
- 一般恢复
添加数据 ——>进行完全备份 ——>录入新的数据 ——>进行增量备份 ——>模拟故障 ——>恢复操作
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u root -p
- 基于位置恢复
就是将某个起始时间的二级制日志导入数据库中,从而跳过某个发生错误的时间点实现数据的恢复
mysqlbinlog --stop-position='操作id' 二进制日志 | mysql -u用户名 -p密码
[root@localhost data]# --stop-position='1131' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
- 基于时间点恢复
可能会出现在一个时间点里既同时存在正确的操作又存在错误的操作,所以需要一种更为精确的恢复方式
(1) 从日志开头截止到某个时间点的恢复
mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
mysqlbinlog --no-defaults --stop-datetime='2020-01-09 17:56:36' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
(2)从某个时间点到日志结尾的恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
mysqlbinlog --no-defaults --start-datetime='2020-01-09 17:57:03' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
(3)从某个时间点到某个时间点的恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日 小时:分钟:秒’ 二进制日志| mysql -u用户名 -p密码