备份的主要目的是灾难恢复。
在生产环境中,数据的安全性至关重要。
任何数据的丢失都可能产生严重的后果。
造成数据丢失的原因:
物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。
物理备份方法:
逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份。
即以sql语句的形式,把库、表结构、表数据保存下来。
进行增量备份,需要刷新二进制日志
(阿里云的工具:dts,支持热迁移)
rpm -q xz
#使用xz工具进行压缩,检查xz工具是否已安装
yum install xz -y
#如果没安装,可以先yum安装
systemctl stop mysqld
#关闭服务
mkdir /backup/
#创建备份目录
tar Jcvf /backup/mysql_all_$(date +%F).tar.xz <数据库文件存放目录>
#打包数据库文件。
#源码编译安装/usr/local/mysql/data
#yum安装/var/lib/mysql/
cd /backup/
#切换到备份目录
ls
#查看目录内容
tar tf mysql_all_2022-06-05.tar.xz
#查看tar包内的文件
tar Jxvf /backup/mysql_all_2024-11-22.tar.xz
#解压备份的数据库文件。
mv /backup/usr/local/mysql/data/ <数据库文件存放目录>
mysqldump -u root -p密码 --databases 库1 [库2 ....] > XXX.sql
#备份一个或多个指定的库及库中所有的表
mysqldump -u root -p密码 --all-databases > XXX.sql
#备份所有库
mysqldump -u root -p密码 库名 > XXX.sql
#只备份指定库中的所有表(不包含库对象本身)
mysqldump -u root -p密码 库名 表1 [表2 ....] > XXX.sql
#只备份指定库中的一个或多个指定的表(不包含库对象本身)
mysql -u root -p -e 'drop database xy101;'
#“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
mysql -u root -p -e 'SHOW DATABASES;'
mysql -u root -p < /opt/xy101.sql
mysql -u root -p -e 'SHOW DATABASES;'
#当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。
mysqldump -u root -p xy101 info1 > /opt/xy101_info1.sql
mysql -u root -p -e 'drop table xy101.info1;'
mysql -u root -p -e 'show tables from xy101;'
mysql -u root -p xy101 < /opt/xy101_info1.sql
mysql -u root -p -e 'show tables from xy101;'
1.开启二进制日志功能
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED #可选,指定二进制日志(binlog)的记录格式为 MIXED
server-id = 1
#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式)
systemctl start mysqld
ls -l /usr/local/mysql/data/mysql-bin.*
2.可每周对数据库或表进行完全备份
mysqldump -u root -p xy101 info1 > /opt/xy101_info1_$(date +%F).sql
mysqldump -u root -p --databases xy101 > /opt/xy101_$(date +%F).sql
3.可每天进行增量备份操作,生成新的二进制日志文件(例如 mysql-bin.000002)
mysqladmin -u root -p flush-logs
4.插入新数据,以模拟数据的增加或变更
use xy101;
insert into info1 values(3,'user3','male','game');
insert into info1 values(4,'user4','female','reading');
5.再次生成新的二进制日志文件(例如 mysql-bin.000003)
mysqladmin -u root -p flush-logs
#之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000003文件中
6.查看二进制日志文件的内容
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:显示详细内容
(1)模拟丢失更改的数据的恢复步骤
use xy101;
delete from info1 where id=3;
delete from info1 where id=4;
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p
(2)模拟丢失所有数据的恢复步骤
use xy101;
drop table info1;
mysql -u root -p xy101 < /opt/xy101_info1_2020-11-22.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
例:
# at 302
#201122 16:41:16
插入了“user3”的用户数据
# at 623
#201122 16:41:24
插入了“user4”的用户数据
(1)基于位置恢复
#仅恢复到操作 ID 为“623”之前的数据,即不恢复“user4”的数据
mysqlbinlog --no-defaults --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p
#仅恢复“user4”的数据,跳过“user3”的数据恢复
mysqlbinlog --no-defaults --start-position='623' /opt/mysql-bin.000002 | mysql -uroot -p
(2)基于时间点恢复
#仅恢复到 16∶41∶24 之前的数据,即不恢复“user4”的数据
mysqlbinlog --no-defaults --stop-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 |mysql -uroot -p
#仅恢复“user4”的数据,跳过“user3”的数据恢复
mysqlbinlog --no-defaults --start-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 |mysql -uroot -p
#如果恢复某条SQL语句之前的所有数据,就stop在这个语句的位置节点或者时间点
#如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start