前言
在企业中数据的价值至关重要,数据保障了企业业务的正常运行。因此,数据的安全性及数据
的可靠性是运维的重中之重,任何数据的丢失都可能对企业产生严重的后果。
一:数据库备份的分类
1.1:数据丢失的原因有哪些?
- 程序错误
- 人为原因(大部分原因)
- 运算错误
- 磁盘故障
- 灾难(如火灾、地震)和盗窃
1.2:从物理与逻辑的角度,备份可以分为
- 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
-
物理备份的方法
- 冷备份(脱机备份):是在关闭数据库的时候进行的(现在基本不常用)
- 热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
- 温备份:数据库锁定表格(不可写入但可读)的状态西进行的备份操作
- 逻辑备份:对数据库逻辑组件(如:表等数据路对象)的备份
1.3:从数据库的备份策略角度可以分为
- 完全备份:每次对数据库进行完整的备份
- 差异备份:备份自从上次完全备份之后被修改过的文件
- 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份
二:MySQL的完全备份
2.1:什么是完全备份?
- 完全备份是对整个数据库的备份、数据库结构和文件结构的备份
- 完全备份保存的是备份完成时刻的数据库
- 完全备份是增量备份的基础
2.2:完全备份的优缺点是什么?
- 优点:安全性高、备份与恢复操作简单方便
- 缺点:数据存在大量重复、占用大量的备份空间、空间利用率低、备份与恢复时间长
2.3:mysqldump备份库
2.3.1:备份MySQL数据库的方式
- 直接打包数据库文件夹,如/usr/local/mysql/data
如:tar jcvf /opt/mysql-$(data+%F).tar.gz /usr/local/mysql/data - 使用专用备份工具mysqldump
2.3.2:什么是mysqldump?
- mysqldump命令是MySQL自带的备份工具,相当方便对MySQL进行备份
- 通过该命令工具可以将指定的库、表或者全部的库导出为SQL脚本,在需要恢复时可以进行数据恢复
2.3.3:如何使用mysqldump命令进行备份库
- 备份单个库
语法:
mysqldump -u 用户名 -p [密码] [选项] [库名] > /备份路径/备份文件名
例如:
mysqldump -u root -p sjk > /backup/sjk.sql
- 备份多个库
语法:
mysqldump -u 用户名 -p [密码] [选项] --databases 库名1 [库名2] ... > /备份路径/备份文件名(多个库之间用空格隔开)
例如:
mysqldump -u root -p --databases mysql test > /backup/my_tt.sql
- 对所有的库完全备份
语法:
mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
例如:
mysqldump -u root -p --opt --all-databases > /backup/all_data.sql
2.3.4:如何使用mysqldump命令进行备份表
- 使用mysqldump备份表的操作
语法
mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
例如
mysqldump -u root -p sjk info > /backup/sjk_info.sql
- 使用mysqldump备份表的结构
mysqldump -u 用户名 -p [密码] [选项] -d 数据库名 表名 > /备份路径/备份文件名
例如
mysqldump -u root -p -d sjk info > /backup/sjk_info.sql
三:如何恢复数据库和表
3.1:恢复数据库的两种方法
- source命令
mysql > source /backup/all-data.sql
'//source命令在mysql库中使用'
- mysql命令
语法:
mysql -u 用户名 -p [密码] < 库备份脚本的路径
'//此处用了导入<符号,而不是导出>符号'
例如
mysql -u root -p < /backup/all-data.sql
3.2:恢复表的两种方法
- 恢复表时同样可以使用source或者mysql命令
- source恢复表的操作与恢复库的操作相同
- 当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在
语法
mysql -u 用户名 -p [密码] < 表备份脚本的路径
例如
mysql -u root -p mysql < /backup/mysql_info.sql
四:MySQL的增量备份
4.1:什么是MySQL增量备份
- 只有那些在上次完全备份或者增量备份后被修改的文件才会被备份
- 增量备份就是备份自上一次备份之后增加或变化的文件或者内容
4.2:增量备份的优缺点
- 优点:没有数据重复、效率高、空间利用率最大化;备份量不大、时间段
- 缺点:恢复麻烦(需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反复恢复);安全性低
4.3:如何实现MySQL增量备份?
- MySQL没有提供直接的增量备份的方法
- 可以通过MySQL提供的二进制文件(binary logs)简介实现增量备份
MySQL的配置文件的[mysqld]项中加入log-bin=filepath项(filepath是二进制文件的路径),如log-bin=mysql-bin,然后重启mysqld服务。
二进制日志文件的默认路径为/usr/local/mysql/data
[root@localhost ~]# vim /etc/my.cnf
'//在[mysqld]项中加入配置 log-bin=mysql-bin'
...省略内容
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-bin=mysql-bin '//添加此句'
...省略内容
[root@localhost ~]# systemctl restart mysqld '//重启服务'
[root@localhost ~]# ls /usr/local/mysql/data/
...省略内容
mysql-bin.000001 '//发现已经生成了二进制文件,设置成功'
...省略内容
-
MySQL二进制日志对备份的意义
- 二进制日志保存了所有更新或者可能更新数据库的操作
- 二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush-logs命令后重新创建新的日志文件
语法
mysqladmin -u 用户名 -p [密码] flush-logs
- 只需定时执行flush-logs方法重新创建新的日志,生成二进制文件序列,并及时把这些旧的日志保存到安全的地方就完成了一个时间段的增量备份
五:如何增量恢复MySQL数据库
5.1:查看日志文件中的操作语句
mysqlbinlog --no-defaults --base64-output=decode-rows -v 日志文件名称 /opt/1.txt '//使用64位解码器按行输出日志文件放到/opt/1.txt中'
cat /opt/1.txt '//查看日志文件的详细信息'
5.2:一般恢复
语法
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p
5.3:断点恢复
- 基于位置恢复
- 就是将某个起始时间的二进制日志导入数据库中,从而跳过某个发生错误的时间点实现数据的恢复
恢复数据到指定位置
mysqlbinlog --stop-position='操作id' 二进制日志 |mysql -u 用户名 -p 密码
从指定的位置开始恢复数据
mysqlbinlog --start-position='操作id' 二进制日志 |mysql -u 用户名 -p 密码
- 基于时间点的恢复
- 使用基于时间点的恢复,可能会出现在一个时间点里既同时存在正确的操作又存在错误的操作,所以我们需要一种更为精确的恢复方式
从日志开头截止到某个时间点的恢复
mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码
从某个时间点到日志结尾的恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码
从某个时间点到某个时间点的恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码