备份的主要目的是灾难恢复。在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果。
造成数据丢失的原因有以下几点:程序错误、人为操作错误、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃等等众多因素。
从物理与逻辑的角度,备份可分为物理备份和逻辑备份。
从数据库的备份策略角度,备份可分为完全备份、差异备份和增量备份。
物理冷备
备份时数据库处于关闭状态,直接打包数据库文件。
备份速度快,恢复时也是最简单的。
专用备份工具mysqldump或mysqlhotcopy
mysqldump常用的逻辑备份工具
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表
启用二进制日志进行增量备份
进行增量备份,需要刷新二进制日志
第三方工具备份
免费的MySQL热备份软件Percona、XtraBackup
完全备份是对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库。完全是差异备份与增量备份的基础。
完全备份的优点是备份与恢复操作简单方便;缺点是数据存在大量的重复、占用大量的备份空间、备份与恢复时间长。
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');
关闭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;
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
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 "^$"
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
登录到mysql数据库
执行source命令备份sql脚本路径
source /备份路径/备份文件名.sql
例如
source /opt/class.sql
show databases;
select * from class.info1;
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;'
使用mysqldump进行完全备份会存在问题,分别是备份数据中有重复数据和备份时间与恢复时间过长。
这个时候就需要使用msyql增量备份,而增量备份是自上一次备份后增加/变化的文件或者内容。其主特点有以下两点:
Mysql没有提供直接的增量备份方法,可通过Mysql提供的二进制日志间接实现增量备份.
二进制日志保存了所有更新或者可能更新数据库的操作。
二进制日志在启动MySQL服务器后开始记录,并在文件达到 max_binlog_size
所设置的大小或者接收到flush logs命令后重新创建新的日志文件。
只需定时执行 flush logs
方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。
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/
#二进制日志(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:显示详细内容
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
#查看
cat mysql-bin.000002
mysqlbinlog --no-defaults --start-position=‘位置点’ 二进制日志文件 | mysql -u用户名 -p密码
mysqlbinlog --no-defaults --start-datetime=‘时间点1’ 二进制日志文件 | mysql -u用户名 -p密码
通常情况需要执行一次完全备份后,再定期执行增量备份。现需要实现今晚12:00做完全备份,之后每天执行增量备份。
#完全备份脚本
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)
crontab -e
0 0 28 10 * /sqlbinlog/generalbak.sh
0 0 * * * /sqlbinlog/addbak.sh
设置一个周期性任务,每周二、三凌晨0点做数据库的完全备份,每天凌晨做增量备份。
mysql -uroot -pabc123 -e "show databases";