文章目录
- 一、数据库备份的分类
- 1. 数据备份的重要性
- 2. 数据库备份的分类
- 3. 常见的备份方法
- 二、Mysql 完全备份与恢复
- 1. Mysql 完全备份
- 2. 数据库完全备份分类
- 2.1 物理冷备份及恢复
- 2.2 mysqldump 备份数据库
- 完全备份一个或多个完整的库(包括其中所有的表)
- 完全备份 MySQL 服务器中所有的库
- 完全备份指定库中的部分表
- 查看备份文件
- 2.3 XtraBackup 备份数据库
- 3. 恢复数据库及表的操作
- 3.1 source命令恢复数据
- 3.2 msyql命令恢复数据
- 三、Mysql 增量备份与恢复
- 1. Mysql 增量备份
- 2. Mysql 增量备份的方法
- 2.1 Mysql二进制日志对备份的意义
- 2.2 Mysql 日志管理
- 2.3 二进制日志
- 3. Mysql增量恢复
- 3.1 一般恢复
- 模拟丢失更改的数据的恢复步骤
- 模拟丢失所有数据的恢复步骤
- 3.2 断点恢复
- 基于位置恢复
- 基于时间点恢复
- 四、备份加入计划任务
- 1.编写完全备份脚本和增量备份脚本
- 2.加入计划任务
- 总结
- 1. 一般是生产环境如何进行备份
- 2. mysql 免交互
一、数据库备份的分类
1. 数据备份的重要性
备份的主要目的是灾难恢复。在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果。
造成数据丢失的原因有以下几点:程序错误、人为操作错误、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃等等众多因素。
2. 数据库备份的分类
从物理与逻辑的角度,备份可分为物理备份和逻辑备份。
- 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。物理备份有三种备份方法,分别是冷备份、热备份、温备份。冷备份(脱机备份)是在关闭数据库的时候进行的;热备份(联机备份)数据库处于运行状态,依赖于数据库的日志文件;温备份就是数据库锁定表格(不可写入但可读)的状态下进行备份操作。
- 逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份。
从数据库的备份策略角度,备份可分为完全备份、差异备份和增量备份。
- 完全备份:每次对数据库进行完整的备份。
- 差异备份:备份自从上次完全备份之后被修改过的文件。
- 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份。
3. 常见的备份方法
物理冷备
备份时数据库处于关闭状态,直接打包数据库文件。
备份速度快,恢复时也是最简单的。
专用备份工具mysqldump或mysqlhotcopy
mysqldump常用的逻辑备份工具
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表
启用二进制日志进行增量备份
进行增量备份,需要刷新二进制日志
第三方工具备份
免费的MySQL热备份软件Percona、XtraBackup
二、Mysql 完全备份与恢复
1. Mysql 完全备份
完全备份是对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库。完全是差异备份与增量备份的基础。
完全备份的优点是备份与恢复操作简单方便;缺点是数据存在大量的重复、占用大量的备份空间、备份与恢复时间长。
2. 数据库完全备份分类
use CLASS;
create table if not exists info1 (
id int(4) not null auto_increment,
name varchar(10) not null,
sex char(10) not null,
hobby varchar(50),
primary key (id));
insert into info1 values(1,'user1','male','running');
insert into info1 values(2,'user2','female','singing');
2.1 物理冷备份及恢复
关闭MySQL数据库
使用tar命令直接打包数据库文件夹
直接替换现有MySQL目录即可
#关闭mysql,备份data目录
systemctl stop mysqld
yum -y install xz
#压缩备份data目录
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
#解压恢复
mv /usr/local/mysql/data/ ~
tar Jxvf /opt/mysql_all_2020-11-22.tar.xz
mv /opt/usr/local/mysql/data/ /usr/local/mysql/
#验证备份数据
systemctl restart mysqld
mysql -u root -p 123456
show databases;
use class;
select * from info1;
2.2 mysqldump 备份数据库
MySQL自带的备份工具,可方便实现对MySQL的备份
可以将指定的库、表导出为SQL脚本
使用命令mysql导入备份的数据
完全备份一个或多个完整的库(包括其中所有的表)
#导出的就是数据库脚本文件
mysqldump -u 用户名 -p [密码][选项][数据库名] > /备份路径/备份文件
例如
mysqldump -u root -p 123456 --databses class > /opt/class.sql
mysqldump -u root -p 123456 --databses class school > /opt/class-school.sql
完全备份 MySQL 服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例如
mysqldump -uroot -p123456 --all-databases > /opt/all.sql
完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql
例如
mysqldump -uroot -p123456 [-d] info1 > /opt/class_info1.sql
使用-d
选项,说明只保存数据库的表结构。不使用“-d”选项,说明表数据也进行备份。
查看备份文件
grep -v "^--" /opt/class_info1.sql | grep -v "^/" | grep -v "^$"
2.3 XtraBackup 备份数据库
xtrabackup备份还原速度极快,备份的是ibd文件。mysql的db文件30GB左右,30分钟以内完成备份还原。
备份还原过程,测试环境和正式环境xtrabackup版本、mysql版本需保持一致。
#全量备份主库数据
xtrabackup --backup --user=root --password=xxx --port=3306 --targetdir=/comProject/backup/db/full_20220831
#将full_20220831文件上传到从库服务器上
#关闭存库服务
service mysqld stop
#对数据进行“预备”(Prepare)操作,使数据文件完全一致
xtrabackup --prepare --target-dir=/comproject/backup/db/full/
#复制数据到从库
xtrabackup --copy-back --target-dir=/comproject/full_20220831/
#修改用户和用户组权限
chown -R mysql:mysql /comproject/db
#启动数据库
service mysqld start
3. 恢复数据库及表的操作
3.1 source命令恢复数据
登录到mysql数据库
执行source命令备份sql脚本路径
source /备份路径/备份文件名.sql
例如
source /opt/class.sql
show databases;
select * from class.info1;
3.2 msyql命令恢复数据
mysql -u root -p [密码] < 库备份脚本的路径
例如
mysql -u root -p -e 'drop database class;'
mysql -u root -p -e 'show databases;'
mysql -u root -p class < /opt/class.sql
mysql -u root -p -e 'show databases;'
mysql -u root -p -e 'select * from class.info1;'
三、Mysql 增量备份与恢复
1. Mysql 增量备份
使用mysqldump进行完全备份会存在问题,分别是备份数据中有重复数据和备份时间与恢复时间过长。
这个时候就需要使用msyql增量备份,而增量备份是自上一次备份后增加/变化的文件或者内容。其主特点有以下两点:
- 没有重复数据,备份量不大,时间短。
- 恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复。
2. Mysql 增量备份的方法
Mysql没有提供直接的增量备份方法,可通过Mysql提供的二进制日志间接实现增量备份.
2.1 Mysql二进制日志对备份的意义
二进制日志保存了所有更新或者可能更新数据库的操作。
二进制日志在启动MySQL服务器后开始记录,并在文件达到 max_binlog_size
所设置的大小或者接收到flush logs命令后重新创建新的日志文件。
只需定时执行 flush logs
方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。
2.2 Mysql 日志管理
MySQL 的日志默认保存位置为 /usr/local/mysql/data
mysql -u root -p
show variables like 'general%'; #查看通用查询日志是否开启
show variables like 'log_bin%'; #查看二进制日志是否开启
show variables like '%slow%'; #查看慢查询日功能是否开启
vim /etc/my.cnf
[mysqld]
##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
log-error=/usr/local/mysql/data/mysql_error.log #指定日志的保存位置和文件名
##通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
##二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
log-bin=mysql-bin #也可以 log_bin=mysql-bin
##慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 #设置超过5秒执行的语句被记录,缺省时为10秒
systemctl restart mysqld
mysql -u root -p
show variables like 'general%'; #查看通用查询日志是否开启
show variables like 'log_bin%'; #查看二进制日志是否开启
show variables like '%slow%'; #查看慢查询日功能是否开启
show variables like 'long_query_time'; #查看慢查询时间设置
set global slow_query_log=ON; #在数据库中设置开启慢查询的方法
ls /usr/local/mysql/data/
2.3 二进制日志
#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
ls /usr/local/mysql/data/
#可每周对数据库或表进行完全备份
mysqldump -u root -p123456 class info1 > /opt/class_info1_$(date +%F).sql
mysqldump -u root -p123456 --databases class > /opt/class_$(date +%F).sql
#可每天进行增量备份操作,生成新的二进制日志文件(例如 mysql-bin.000002)
mysqladmin -u root -p123456 flush-logs
#插入新数据,以模拟数据的增加或变更
use class;
insert into info1 values(3,'user3','male','game');
insert into info1 values(4,'user4','female','reading');
#再次生成新的二进制日志文件(例如 mysql-bin.000003)
mysqladmin -u root -p flush-logs
#之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000003文件中
#查看二进制日志文件的内容
cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#--base64-output=decode-rows:使用64位编码机制去解码并按行读取
#-v:显示详细内容
3. Mysql增量恢复
3.1 一般恢复
模拟丢失更改的数据的恢复步骤
use class;
delete from t1 where id=3;
delete from t1 where id=4;
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p123
模拟丢失所有数据的恢复步骤
use class;
drop table t1;
mysql -u root -p123 kb < /opt/kb_all_tables.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p
3.2 断点恢复
#查看
cat mysql-bin.000002
基于位置恢复
mysqlbinlog --no-defaults --start-position=‘位置点’ 二进制日志文件 | mysql -u用户名 -p密码
基于时间点恢复
mysqlbinlog --no-defaults --start-datetime=‘时间点1’ 二进制日志文件 | mysql -u用户名 -p密码
四、备份加入计划任务
通常情况需要执行一次完全备份后,再定期执行增量备份。现需要实现今晚12:00做完全备份,之后每天执行增量备份。
1.编写完全备份脚本和增量备份脚本
#完全备份脚本
vim generalbak.sh
#!/bin/bash
mysqldump -uroot -p123123 --all-databases > /sqlbinlog/mysql_general_bak.sql
#增量备份脚本
vim addbak.sh
#!/bin/bash
mysqladmin -uroot -p123123 flush-logs
filename=$(tail -2 /usr/local/mysql/data/mysql-bin.index | head -1 |awk -F'/' '{print $2}')
mv /usr/local/mysql/data/$filename /sqlbinlog/mysql-bin-$(date +%Y%m%d)
2.加入计划任务
crontab -e
0 0 28 10 * /sqlbinlog/generalbak.sh
0 0 * * * /sqlbinlog/addbak.sh
总结
1. 一般是生产环境如何进行备份
设置一个周期性任务,每周二、三凌晨0点做数据库的完全备份,每天凌晨做增量备份。
2. mysql 免交互
mysql -uroot -pabc123 -e "show databases";