一.数据库备份的概述
- 数据库备份提高系统的高可用性和灾难恢复性,在数据库系统崩溃时,没有数据库备份就没办法找到数据
- 使用数据库备份还原数据库,是数据库崩溃时提供数据恢复最小代价的最优方案,如果让用户重新添加数据,代价未免太大
- 没有数据就没有一切,数据库备份是一种防范灾难的强力手段
- 有多种原因造成数据的丢失:程序错误、人为错误、计算机失败、磁盘失败、物理灾难
二.数据库备份的分类
从物理与逻辑的角度区分
- 物理备份:指对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。物理备份又可以脱机备份(冷备份:在关闭数据库时进行的备份操作,能够较好地保证数据库的完整性)和联机备份(热备份:在数据库运行状态中进行操作,这种备份方法依赖于数据库的日志文件)
- 逻辑备份:指对数据库的逻辑组件(如表等数据库对象)的备份
从数据库的备份策略角度区分
- 完全备份:每次都对数据库进行完整的备份。可以备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数据库对象,但是它需要花费更多的时间和空间,所以时间比较长
- 差异备份:备份那些自从上次完全备份之后被修改过的文件,只备份数据库部分的内容,它比最初的完全备份小,因为只包含自上次完全备份以来所改变的数据库。它的优点是存储和恢复速度快
- 增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份
- 备份方式比较
备份方式 | 完全备份 | 差异备份 | 增量备份 |
完全备份时的状态 | 表1、表2 | 表1、表2 | 表1、表2 |
第一次添加内容 | 创建表3 | 创建表3 | 创建表3 |
备份内容 | 表1、表2、表3 | 表3 | 表3 |
第二次添加内容 | 创建表4 | 创建表4 | 创建表4 |
备份内容 | 表1、表2、表3、表4 | 表3、表4 | 表4 |
三.完全备份与恢复
- 完全备份的优点是备份与恢复操作简单方便,缺点是数据存在大量重复,占用大量的备份空间,备份时间长
- 完全备份有两种方式:使用tar打包文件夹备份;使用mysqldump工具备份
使用tar打包文件夹备份
- MySQL的数据库文件默认都是保存在安装目录的data文件夹下面,可以直接保存data文件夹,但是占用的空间较大,可以使用tar打包压缩进行保存
- 模拟恢复数据库,删除数据库
- 解压备份数据,查看数据库
使用mysqldump工具备份
- 对单个表进行完全备份
- 模拟source恢复
- 模拟mysql命令恢复
- 对表结构备份
- 对单个库进行备份
- 对多个库备份
- 对所有库备份
- 模拟恢复,source命令和mysql命令
-
##删除单个库
-
mysql> drop database school;
-
##执行source命令
-
mysql>
source /opt/school.sql
-
##删除单个库
-
mysql> drop database school;
-
##执行mysql命令
-
[root@localhost opt]
# mysqldump -u root -pabc123 --all-databases > /opt/school.sql
注:>,会覆盖原有的数据
四.增量备份与恢复
- 增量备份的优点是没有重复数据,备份量不大,时间短;缺点也明显,需要上次完全备份以及完全备份之后的所有增量备份才能恢复,而且对所有增量备份进行逐个反推恢复,操作较为繁琐
- MySQL没有直接提供增量备份的方法,但是通过MySQL的二进制日志间接实现增量备份
- 二进制日志保存了所有更新或者可能更新或者可能更新数据库的操作
- 二进制日志在启动MySQL服务器后开始记录,并且在文件达到max_binlog_size所设置的大小或者接收到的flush logs命令之后重新创建日志文件
- 只需要定时执行flush logs 方法重新创建新的日志,生成日志文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份
增量备份的具体操作
- 开启二进制日志功能,重启服务
-
[root@localhost ~]
# vim /etc/my.cnf
-
...
-
log-bin=mysql-bin
-
...
-
[root@localhost ~]
# service mysqld restart
-
Shutting down MySQL... SUCCESS!
-
Starting MySQL.. SUCCESS!
-
[root@localhost ~]
#
- 确定字符集使用 utf-8 ,避免出现乱码问题
-
mysql> show variables like
'%char%';
-
+--------------------------+----------------------------------+
-
| Variable_name | Value
|
-
+--------------------------+----------------------------------+
-
| character_set_client
| utf8 |
-
| character_set_connection | utf8
|
-
| character_set_database
| utf8 |
-
| character_set_filesystem | binary
|
-
| character_set_results
| utf8 |
-
| character_set_server | utf8
|
-
| character_set_system
| utf8 |
-
| character_sets_dir | /usr/local/mysql/share/charsets/
|
-
+--------------------------+----------------------------------+
-
8 rows in set (0.00 sec)
-
-
mysql>
-
- 使用mysqldump工具进行完全备份表和库
-
[root@
192 opt]
# ls
-
mysql
-5.6
.26 rh
-
[root@
192 opt]
#
-
[root@
192 opt]
# mysqldump -u root -pabc123 school info > /opt/info$(date +%F).sql
-
Warning:
Using a password
on the command line
interface can be insecure.
-
[root@
192 opt]
# mysqldump -u root -pabc123 --databases school > /opt/school$(date +%F).sql
-
Warning:
Using a password
on the command line
interface can be insecure.
-
[root@
192 opt]
# ls /opt
-
info2020
-01
-08.sql mysql
-5.6
.26 rh school2020
-01
-08.sql
- 查看二进制文件
- 刷新生成新二进制文件,记录接下来的插入命令
-
[root@192 mysql]#
mysqladmin
-uroot
-pabc123
flush-logs
-
Warning:
Using
a
password
on
the
command
line
interface
can
be
insecure.
-
[root@192 mysql]#
ls
-
auto
.cnf
ibdata1
ib_logfile1
-
localhost
.localdomain
.pid
mysql-bin
.000001
-
mysql-bin
.index
performance_schema
test
-
class
ib_logfile0
localhost
.localdomain
.err
-
mysql
mysql
.sock
school
- 查看二进制日志文件,完成增量备份
增量备份的恢复
-
/home/mysql/mysql-bin
.000001 中的信息
-
第一条插入语句的开始位置和时间
-
# at 447
-
#200108 22:19:33
-
-
第一条语句的提交时间和位置
-
# at 595
-
#200108 22:19:59
-
-
第二条删除语句的开始位置和时间
-
# at 678
-
#200108 22:19:59
-
第二条删除语句的提交位置和时间
-
# at 817
-
#200108 22:20:15
-
-
第三条插入语句的开始位置和时间
-
# at 900
-
#200108 22:20:15
-
第三条语句的提交位置和时间
-
# at 1048
-
#200108 22:20:29
-
- 基于时间的恢复
-
[
root@
192 mysql]# mysqlbinlog --stop-datetime=
'2020-01-08 22:19:59'
-
/home/mysql/mysql-bin
.000001 | mysql -u root -pabc123
-
Warning: Using a password on the command line
interface can be insecure.
-
[
root@
192 mysql]# mysqlbinlog --start-datetime=
'2020-01-08 22:20:15'
-
/home/mysql/mysql-bin
.000001 | mysql -u root -pabc123
-
Warning: Using a password on the command line
interface can be insecure.
- 基于位置的恢复
-
[
root@
192 mysql]# mysqlbinlog --start-position=
'595'
-
/home/mysql/mysql-bin
.000001 | mysql -u root -pabc123
-
Warning: Using a password on the command line
interface can be insecure.
-
[
root@
192 mysql]# mysqlbinlog --stop-position=
'900'
-
/home/mysql/mysql-bin
.000001 | mysql -u root -pabc123
-
Warning: Using a password on the command line
interface can be insecure.