四、MySQL完全备份与恢复
实验环境
MySQL CentOS7 192.168.19.18 mysql-boost-5.7.20.tar.gz
mysql -u root -p create database SCHOOL; use SCHOOL; create table if not exists CLASS1 ( 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 CLASS1 values(1,'user1','male','running'); insert into CLASS1 values(2,'user2','female','singing'); set password = password('123123');
MySQL 完全备份
InnoDB存储引擎的数据库在磁盘上存储成三个文件:db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件)。
1.物理冷备份与恢复
systemctl stop mysqld yum -y install xz
压缩备份
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
解压恢复
tar Jxvf /opt/mysql_all_2020-11-22.tar.xz -C /usr/local/mysql/data systemctl restart mysql
2.mysqldump 备份与恢复
(1)完全备份一个或多个完整的库(包括其中所有的表)
mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql #导出的就是数据库脚本文件
例:
mysqldump -uroot -p123123 --databases SCHOOL > /opt/SCHOOL.sql mysqldump -uroot -p123123 --databases mysql SCHOOL > /opt/mysql-SCHOOL.sql
(2)完全备份 MySQL 服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
(3)完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
mysqldump -uroot -p123123 SCHOOL CLASS1 > /opt/SCHOOL_CLASS1.sql #使用“-d”选项,说明只保存数据库的表结构 #不使用“-d”选项,说明表数据也进行备份
(4)查看备份文件
grep -v "^--" /opt/SCHOOL_CLASS1.sql | grep -v "^/" | grep -v "^$"
完全备份恢复
1、恢复数据库
mysql -uroot -p123123 -e 'drop database SCHOOL;'
#“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
mysql -uroot -p123123 -e 'SHOW DATABASES;' mysql -uroot -p123123 < /opt/SCHOOL.sql mysql -uroot -p123123 -e 'SHOW DATABASES;'
2、恢复数据表
mysql -uroot -p123123 -e 'drop table SCHOOL.CLASS1;' mysql -uroot -p123123 -e 'show tables from SCHOOL;' mysql -uroot -p123123 SCHOOL < /opt/SCHOOL_CLASS1.sql mysql -uroot -p123123 -e 'show tables from SCHOOL;'
五、MySQL 增量备份与恢复
MySQL 增量备份
1、开启二进制日志功能
vim /etc/my.cnf [mysqld] log-bin=mysql-bin binlog_format = MIXED server-id = 1
#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
systemctl restart mysqld ls -l /usr/local/mysql/data/mysql-bin.*
2、可每周对数据库或表进行完全备份
mysqldump -uroot -p123123 SCHOOL CLASS1 > /opt/SCHOOL_CLASS1_$(date +%F).sql mysqldump -uroot -p123123 --all-databases SCHOOL > /opt/SCHOOL_$(date +%F).sql
3、可每天进行增量备份操作,生成新的二进制日志文件(例如 mysql-bin.000003)
mysqladmin -uroot -p123123 flush-logs
4、插入新数据,以模拟数据的增加或变更
mysql -uroot -p123123 use SCHOOL; insert into CLASS1 values(3,'user3','male','game'); insert into CLASS1 values(4,'user4','female','reading');
5、再次生成新的二进制日志文件(例如 mysql-bin.000004)
mysqladmin -uroot -p123123 flush-logs
#之前的步骤4的数据库操作会保存到mysql-bin.000003文件中,之后数据库数据再发生变化则保存在mysql-bin.000004文件中
6、查看二进制日志文件的内容
cp /usr/local/mysql/data/mysql-bin.000003 /opt/ mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#- -base64-output=decode-rows:使用64位编码机制去解码并按行读取
#-v:显示详细内容