数据库备份
物理备份:直接对数据库的数据文件或者日志文件进行备份.
逻辑备份:对数据库的库或表对象进行备份.
备份策略
完全备份:每次备份都备份完整的数据库.
差异备份:只备份上一次完全备份后的更新数据.
增量备份:每次备份只备份上一次完全备份或增量备份后的最新数据.
完全备份
增量备份
物理冷备
备份时数据库处于关闭状态,直接打包数据库文件
备份速度快,恢复时也是最简单的
专用备份工具mysqldump或mysqlhotcopy
mysqldump常用的逻辑备份工具
mysqlhotcopy仅拥有备份MylSAM和ARCHIVE表
启用二进制日志进行增量备份
第三方工具备份
优点
备份与恢复操作简单方便
缺点
物理冷备份与恢复
补充:
tar zcvf 归档文件 原数据文件/目录 gzip
tar jcvf 归档文件 原数据文件/目录 bzip2
tar Jcvf 归档文件 原数据文件/目录 xz
mysqldump备份与恢复
物理冷备份
先关闭数据库,然后打包备份相关数据库文件;
systemctl stop mysqld
mkdir /opt/backup #将数据库备份文件保存到/opt/backup目录下
cd /usr/local/mysql
tar zcf /opt/backup/mysql_data-$(date +%F).tar.gz data/
cd /opt/backup/
tar tf mysql_data-2023-06-19.tar.gz #查看tar压缩包里的数据文件
tar xf mysql_data-2023-06-19.tar.gz #解压缩tar压缩包里的数据文件
说明:
上面备份的数据库文件数据mysql_data-2023-06-19.tar.gz,作为远端异地已经备份好的数据库文件(IP:192.168.80.60),然后加载到另一台需要恢复的数据库主机(IP:192.168.80.70)。
###远端已备份数据文件主机(IP:192.168.80.60)
cd /opt/backup
scp mysql_data-2023-06-19.tar.gz 192.168.80.70:/opt
###需要恢复数据库文件主机(IP:192.168.80.70)
systemctl stop mysqld
cd /opt
tar xf mysql_data-2023-06-19.tar.gz
mv /usr/local/mysql/data /usr/local/mysql/data.bak #将原有的数据库文件移走
mv /opt/data/ /usr/local/mysql/
systemctl restart mysqld #重新启动数据库服务
mysql -uroot -p111 #此数据库密码为之前备份数据库的密码
DTS (Data Transmission Service,数据传输服务),用于在关系型数据库、NoSQL数据库、数据仓库之间迁移数据。可以使用DTS将数据迁移至阿里云,也可以在阿里云和本地数据系统之间做数据迁移。
DTS的优势
相比传统的数据传输工具,DTS的优势:
(1) 传输过程中保证高稳定性
(2) 支持多种数据传输方式,包括:数据迁移、数据集成、数据同步、数据订阅。
(3) 支持各种数据源直接的数据迁移。(如MySQL,redis等)
(4) 支持多种数据库引擎作为源和目标
(5) 支持断点续传:避免了硬件和网络故障导致的中断
(6) 支持定时任务
数据迁移总结:
体量小:
物理冷备 打包备份+恢复
体量中等:
DTS
体量超大:
数据魔方
备份指定数据库文件:
mysqldump -u用户名 -p密码 --databases 数据库名 > 指定路径的绝对路径/数据库名.sql
###将数据库gzy的数据文件备份到/opt/backup目录下,并重命名为gzy.sql
mysqldump -uroot -p111 --databases gzy > /opt/backup/gzy.sql
vim /opt/backup//gzy.sql
###同时备份gzy和mysql两个数据库文件
mysqldump -uroot -p111 --databases gzy mysql > /opt/backup/mysql_gzy.sql
备份所有数据库文件:
mysqldump -u用户名 -p密码 --all-databases > 指定路径的绝对路径/all.sql
###备份所有数据库中的数据库文件数据
mysqldump -uroot -p111 --all-databases > /opt/backup/all-databases.sql
###过滤出备份文件中,不以“--”和"/*"开头,并且以“CREATE DATABASE”开头的数据行
cat all-databases.sql | grep -v "^--" | grep -v "^/\*" | grep "^CREATE DATABASE"
备份指定数据库中的表数据文件:
mysqldump -u用户名 -p密码 数据库名 表名 > 指定路径的绝对路径/数据库名_表名.sql
###备份gzy数据库中clr表数据内容
mysqldump -uroot -p111 gzy clr > /opt/backup/gzy_clr.sql
vim /opt/backup/gzy_clr.sql
备份指定数据库中的所有表数据文件:
mysqldump -u用户名 -p密码 数据库名 > 指定路径的绝对路径/数据库名_all.sql
###备份gzy数据库中的所有表数据内容,会包含gzy数据库中的所有表信息,但不包括创建数据库的操作
mysqldump -uroot -p111 gzy> /opt/backup/gzy_all.sql
vim /opt/backup/gzy_all.sql
完全备份
物理冷备:
先关闭mysqld服务,使用tar命令打包备份数据库的数据目录/文件 /usr/local/mysql/data/
mysqldump、xtrabackup等工具来逻辑备份
###备份单库或多库
mysqldump -uXXX -pXXX --databases 库1 [库2] ... > XXX.sql
###备份所有的库
mysqldump -uXXX -pXXX --all-databases > XXX.sql
###备份库中的一个或多个表数据(不包含创建库的操作)
mysqldump -uXXX -pXXX 库名 表1 表2 ... > XXX.sql
###备份库中的所有表数据(不包含创建库的操作)
mysqldump -uXXX -pXXX 库名 > XXX.sql
使用source命令恢复数据库的备份文件;
###查看gzy数据库中的clr表的数据文件信息(免交互登录数据库的方式)
mysql -uroot -p111 -e "select * from gzy.clr;"
###删除指定数据库gzy
mysql -uroot -p111 -e "drop database gzy;"
###登录数据库
mysql -uroot -p111
###使用source命令恢复指定数据库文件
source /opt/backup/gzy.sql;
注意:
在使用数据库备份文件恢复具体数据库时,可以直接使用source命令直接恢复数据库;但是在使用指定指定数据库中的数据表备份文件恢复数据时,需要先创建数据库,然后切换到新创建的数据库中,使用source命令恢复数据文件。
mysql -uroot -p111 -e "drop database gzy;"
###登录数据库
mysql -uroot -p111
###先创建数据库kgc,然后切换到新创建的数据库kgc中
create database kgc;
use kgc;
###恢复数据库中的数据表文件数据
source /opt/backup/gzy_clr.sql;
select * from clr;
使用mysql重定向的方式恢复指定数据库文件;
mysql -uroot -p111 -e "drop database gzy;"
###使用mysql重定向的方式恢复指定数据库文件
mysql -uroot -p111 < /opt/backup/gzy.sql
mysql -uroot -p111 -e "show databases;"
使用mysql+管道符的方式恢复指定数据库文件;
mysql -uroot -p111 -e "drop database gzy;"
cat /opt/backup/gzy.sql | mysql -uroot -p111
mysql -uroot -p111 -e "show databases;"
免交互方式,使用指定数据库中的数据表文件恢复;
mysql -uroot -p111 -e "drop database gzy;"
mysql -uroot -p111 -e "show databases;"
mysql -uroot -p111 < /opt/backup/gzy_clr.sql
###将已备份好的数据文件恢复到指定数据库kgc中
mysql -uroot -p111 kgc < /opt/backup/gzy_clr.sql
mysql -uroot -p111 -e "select * from kgc.clr;"
###每周二的凌晨十二点半,定时自动执行脚本备份所有的数据库文件数据
30 0 * * 2 xxx/mysqldump-uxx -pxxx --all-databases > /opt/backup/XXX.sql
完全恢复
先登录到mysql,再执行 source XXX.sql(注:如果XXX.sql是表数据文件那么需要先自行创建库并use切换库)
mysql -uXXX -pXXX [库名] < XXX.sql
cat XXX.sql | mysql -uXXX -pXXX [库名]
mysql -uroot -p111
###模糊查询通用日志的相关信息
show variables like 'general%';
###模糊查询二进制日志的相关信息
show variables like 'log_bin%';
###模糊查询慢查询日志的相关信息
show variables like '%slow%';
vim /etc/my.cnf
------------在“server-id”行下面添加mysql数据库的日志信息---------
server-id = 1
---------------------------------------------------------------
#错误日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志
log-bin=mysql-bin
#慢查询日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=2
systemctl restart mysqld
mysql -uroot -p111
刷新生成二进制日志文件的两种方式:
(1)重启数据库服务:systemctl restart mysqld;
(2)flush-logs命令刷新:mysqladmin -uroot -p111 flush-logs;
注意:
新刷新出来的数据日志文件,实际是个空文件,因此应该备份保存的是新刷新出来的前一个序列号的日志文件。
二进制日志(binlog)有3种不同的记录格式:
vim /etc/my.cnf
#错误日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志
log-bin=mysql-bin
#可选,指定二进制日志(binlog)的记录格式为ROW
binlog_format = ROW
#慢查询日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=2
systemctl restart mysqld
###转换格式,查看指定序列号的二进制数据日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000003
--no-defaults:不使用默认格式进行查看
--base64-output=decode-rows:使用base64密码格式进行转换,-rows:按行进行输出
-v:显示详细输出过程
###修改更新数据库文件,可以在新生成的二进制日志数据文件中查看到更新的数据内容
mysql -uroot -p111
use gzy;
update clr set name='xiaoxiao' where id=2;
systemctl restart mysqld
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000005
mkdir /opt/bak
cd /opt/bak/
###full文件用于保存完全备份的数据文件,add用于保存增量备份的数据文件
mkdir full add
mysql -uroot -p111
###创建benet数据库
create database benet;
use benet;
create table t1 (id int,name varchar(20),age int,hobby varchar(50));
insert into t1 values (1,'小狗',22,'吃鱼');
insert into t1 values (2,'小猪',29,'吃牛');
insert into t1 values (3,'小猫',20,'画虎');
###采用完全备份的方式备份benet数据库中的所有内容
mysqldump -uroot -p111 --databases benet > /opt/bak/full/benet-$(date +%F).sql
###刷新权限,采用增量方式备份benet数据库中的所有内容
mysqladmin -uroot -p111 flush-logs
cd /usr/local/mysql/data
mv /usr/local/mysql/data/mysql-bin.000001 /opt/bak/add/mysql-bin-$(date +%F).sql
###新的一天增加新的数据内容,并进行增量备份新增加的数据内容
insert into t1 values (4,'小熊',22,'爬山');
insert into t1 values (5,'小马',25,'跑步');
###增量备份新生成的数据文件
mysqladmin -uroot -p111 flush-logs
mv /usr/local/mysql/data/mysql-bin.000002 /opt/bak/add/mysql-bin-$(date -d "1 day" +%F).sql
###新的一天增加新的数据内容,并进行增量备份新增加的数据内容
insert into t1 values (6,'小驴',22,'走路');
insert into t1 values (7,'小鸡',23,'唱歌');
###增量备份新生成的数据文件
mysqladmin -uroot -p111 flush-logs
mv /usr/local/mysql/data/mysql-bin.000003 /opt/bak/add/mysql-bin-$(date -d "2 day" +%F).sql
###删除提前已经备份好的数据库benet
drop database benet;
完全备份+增量备份的具体恢复步骤:
###先采用完全备份的方式恢复benet数据库的文件内容
cd /opt/bak/full
cat benet-2023-06-19.sql | mysql -uroot -p111
mysql -uroot -p111 -e "show databases;"
mysql -uroot -p111 -e "select * from benet.t1;"
###恢复第二天增量备份到的数据内容
cd /opt/bak/add
mysqlbinlog --no-defaults mysql-bin-2023-06-20.sql | mysql -uroot -p111
mysql -uroot -p111 -e "select * from benet.t1;"
###恢复第三天增量备份到的数据内容
mysqlbinlog --no-defaults mysql-bin-2023-06-21.sql | mysql -uroot -p111
mysql -uroot -p111 -e "select * from benet.t1;"
查看二进制日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制日志文件
刷新二进制日志
mysqladmin -uXXX -pXXX flush-logs
使用二进制日志实现增量恢复
mysqlbinlog --no-defaults 二进制日志文件 | mysql -uXXX -pXXX