备份的主要目的是灾难恢复
在生产环境中,数据的安全性至关重要
任何数据的丢失都可能产生严重的后果
造成数据丢失的原因
1、程序错误
2、人为操作错误
3、运算错误
4、磁盘故障
5、灾难(火灾、地震、盗窃等)
1、物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
物理备份方法:
1.冷备份(脱机备份):是在关闭数据库的时候进行的
2.热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
3.温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作
2、逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份
1、完全备份:每次对数据库进行完整的备份
完全备份是对整个数据库、数据库结构和文件结构的备份。
保存的是备份完成时刻的数据库。
是差异备份与增量备份的基础。
相当于基石。
2、差异备份:备份自从上次完全备份之后被修改过的文件
3、增量备份:只要在上次完全备份或者增量备份后被修改的文件才会被备份
1、物理冷备
备份时数据库处于关闭状态,直接打包数据库文件
备份速度快,恢复时也是最简单的
关闭MySQL数据库
使用tar命令直接打包数据库文件夹 /usr/local/mysql/data
直接替换现有的MySQL目录即可
2、专用备份工具mysqldump或者mysqlhotcopy
mysqldump常用的逻辑备份工具
MySQL自带的备份工具,可实现对MySQL的备份
可以将指定的库、表导出为SQL脚本
使用命令mysql导入备份的数据mysqlhotcopy仅拥有备份myisam和archive表
3、启动二进制日志进行增量备份
进行增量备份,需要刷新二进制日志
4、第三方工具备份
免费的MySQL热备份软件Percona XtraBackup
数据库1服务器
cd/usr/local/mysql/data ##切换到数据库目录
systemctl stop mysqld ##关闭数据库
tar -zcf /opt/mysql/_all_$(date +%y%m%d).tar.gz /usr/local/mysql/data ##压缩到/opt/mysql
cd /opt/mysql ##查看压缩备份的东西
数据库2服务器
把在数据库1服务器的数据库压缩包传输到数据库2服务器(前提把数据库1服务器里面的data目录或者移走)
mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql #导出的就是数据库脚本文件
例子
备份库:
mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql #导出的就是数据库脚本文件
mysqldump -uroot -pabc123 --databases sw > /opt/mysql_sw_test.sql ##导出sw库到/opt/叫mysql_sw_test.sql
多库备份
mysqldump -uroot -p123123 --databases mysql SCHOOL > /opt/mysql-SCHOO ##导出mysql 和 SCHOOL 库到/opt/SCHOOL备份表:
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
mysqldump -uroot -p123123 mysql mysql_test > /opt/mysql-SCHOO ##导出mysql 库中的mysql_test 表到/opt/SCHOOL
多表备份:
mysqldump -uroot -p123123 mysql mysql_test mysql_test1 mysql_test2 > /opt/mysql-SCHOO ##导出mysql 库中的mysql_test 、mysql_test1、mysql_test2表到/opt/SCHOOL
只备份表结构: -d
mysqldump -uroot -p123123 -d --databases mysql mysql_test > /opt/mysql-SCHOO ##导出mysql 库中的mysql_test 表的表结构到/opt/SCHOOL
对所有库进行备份
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
mysql -u root -pabc123 ‘show databases’;
##恢复库之前需要先创建一个名字一样的新库
mysql -u root -pabc123 < /opt/backup/kgc.sql ##把之前备份到/opt/backup的kgc.sql库文件恢复到数据库中
备份这个sw库
恢复库中的表
##kgc库名称
mysql -u root -pabc123 kgc < /opt/backup/kgc.sql ##把备份的表导入kgc这个库中
备份一整个库 但是只恢复一张表
从备份的那个文件截取出那张表的信息单独领出来
vim /etc/my.cof
log-error=/usr/local/mysql/data/mysql_error.log ##指定日志的保存保存位置和文件名
通用查询日志,用来记录Mysql的所有连接和语句,默认是关闭的
general_log=NO
general_log_file=/usr/local/mysql/data/mysql_general.log
二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认是开启的
log-bin=mysql-bin ##也可以 log_bin=mysql-bin
## statement(基于sql语句记录二进制日志,记录写入速度快,在高并发情况会出现sql语句顺序记录偏差导致恢复时数据丢失) (较老)
## row(基于行记录记录二进制日志,写入和恢复速度教于statement比较慢,日志文件占用空间也较大,但是准确性比较高)
##mixed(混合模式 ,平时负载压力较小的时候使用sql语句记录二进制文件,在高并发的时候使用行记录二进制日志文件)
binlog_format=STATEMENT|ROW|MIXED
慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到那些查询语句执行时间长,以便于优化,默认关闭的。
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 ##默认十秒 一般设置1-3秒
修改玩数据库文件之后 systemctl restart mysqld ##重启服务
mysql -uroot -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 ##数据库中开启慢查询的方法
##刷新出一个新的二进制文件
mysqladmin -uroot -pabc123 flush-logs
开启二进制文件日志
vim /etc/my.cnf
[mysqld]
server-id = 1log-bin=mysql-bin
binlog_format = MIXED #指定二进制日志(binlog)的记录格式为 MIXED报错多加
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_format=ROW
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENTsystemctl restart mysqld.service
ls -l /usr/local/mysql/data/mysql-bin.*
mysqldump -u root -p school test > /opt/school_test_$(date +%F).sql
mysqldump -u root -p school > /opt/school_$(date +%F).sql#使用crontab -e 计划性任务来执行;每周1凌晨2点对表test和school库进行完全备份
0 2 * * 1 mysqldump -u root -p school test > /opt/school_test_$(date +%F).sql
0 2 * * 1 mysqldump -u root -p school > /opt/school_$(date +%F).sql
再次生成新的二进制日志文件(例如 mysql-bin.000005)
把刚才生成的00004二进制文件复制到/opt/目录下 (这个0004文件存放着刚才插入的两条数据st和jw)
模拟丢失更改的数据的恢复步骤
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p
创建一个新表
mysqladmin -uroot -pabc123 flush-logs 再刷新一次文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制文件的路径可以查看二进制
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#221027 19:49:06 server id 1 end_log_pos 123 CRC32 0x6457acdb Start: binlog v 4, server v 5.7.17-log created 221027 19:49:06
# at 123
#221027 19:49:06 server id 1 end_log_pos 154 CRC32 0x71e618bf Previous-GTIDs
# [empty]
# at 154
#221027 19:52:02 server id 1 end_log_pos 219 CRC32 0x122fcd32 Anonymous_GTID last_committed=0 sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#221027 19:52:02 server id 1 end_log_pos 346 CRC32 0x8f95e298 Query thread_id=21 exec_time=0 error_code=0
use `bd`/*!*/;
SET TIMESTAMP=1666871522/*!*/;
SET @@session.pseudo_thread_id=21/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1437073414/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table backup_test (id int,name varchar(5),age int)
/*!*/;
# at 346
#221027 19:53:34 server id 1 end_log_pos 411 CRC32 0x193d25a4 Anonymous_GTID last_committed=1 sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 411
#221027 19:53:34 server id 1 end_log_pos 486 CRC32 0xe9052f2e Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871614/*!*/;
BEGIN
/*!*/;
# at 486
#221027 19:53:34 server id 1 end_log_pos 601 CRC32 0xb67c3f61 Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871614/*!*/;
insert into backup_test values (1,'张三',1)
/*!*/;
# at 601
#221027 19:53:34 server id 1 end_log_pos 632 CRC32 0x73a4c268 Xid = 219
COMMIT/*!*/;
# at 632
#221027 19:53:44 server id 1 end_log_pos 697 CRC32 0x910007d6 Anonymous_GTID last_committed=2 sequence_number=3
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 697
#221027 19:53:44 server id 1 end_log_pos 772 CRC32 0x1d5f6641 Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871624/*!*/;
BEGIN
/*!*/;
# at 772
#221027 19:53:44 server id 1 end_log_pos 887 CRC32 0x366a0bf6 Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871624/*!*/;
insert into backup_test values (2,'李四',2)
/*!*/;
# at 887
#221027 19:53:44 server id 1 end_log_pos 918 CRC32 0x9ca52c92 Xid = 220
COMMIT/*!*/;
# at 918
#221027 19:54:04 server id 1 end_log_pos 983 CRC32 0xcda1e7d6 Anonymous_GTID last_committed=3 sequence_number=4
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 983
#221027 19:54:04 server id 1 end_log_pos 1058 CRC32 0xcdb70012 Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871644/*!*/;
BEGIN
/*!*/;
# at 1058
#221027 19:54:04 server id 1 end_log_pos 1173 CRC32 0x0d6f6133 Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871644/*!*/;
insert into backup_test values (3,'王五',3)
/*!*/;
# at 1173
#221027 19:54:04 server id 1 end_log_pos 1204 CRC32 0x3e435631 Xid = 221
COMMIT/*!*/;
# at 1204
#221027 19:54:51 server id 1 end_log_pos 1269 CRC32 0xa3743807 Anonymous_GTID last_committed=4 sequence_number=5
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1269
#221027 19:54:51 server id 1 end_log_pos 1344 CRC32 0x41ebb14b Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871691/*!*/;
BEGIN
/*!*/;
# at 1344
#221027 19:54:51 server id 1 end_log_pos 1448 CRC32 0x02a533fa Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871691/*!*/;
delete from backup_test where id=1
/*!*/;
# at 1448
#221027 19:54:51 server id 1 end_log_pos 1479 CRC32 0x87ca08fa Xid = 223
COMMIT/*!*/;
# at 1479
#221027 19:55:08 server id 1 end_log_pos 1544 CRC32 0xb469eea7 Anonymous_GTID last_committed=5 sequence_number=6
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1544
#221027 19:55:08 server id 1 end_log_pos 1619 CRC32 0x65c2f9b5 Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871708/*!*/;
BEGIN
/*!*/;
# at 1619
#221027 19:55:08 server id 1 end_log_pos 1734 CRC32 0xabcabd92 Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1666871708/*!*/;
insert into backup_test values (4,'王刘',4)
/*!*/;
# at 1734
#221027 19:55:08 server id 1 end_log_pos 1765 CRC32 0xc6467443 Xid = 224
COMMIT/*!*/;
# at 1765
#221027 19:59:22 server id 1 end_log_pos 1812 CRC32 0x0d238c46 Rotate to mysql-bin.000007 pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
恢复到操作ID为‘610’之前的数据,就是不执行删除id=1的操作
mysqlbinlog --no-defaults --stop-position='601' /usr/local/mysql/data/mysql-bin.000006 | mysql -uroot -pabc123
恢复成功
#仅恢复到17:12:40之前的数据,就是不执行删除id=1的操作直接跳过
mysqlbinlog --no-defaults --stop-datetime='2021-04-15 17:12:40' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p35123512
#跳过17:12:40的数据恢复之后的数据
mysqlbinlog --no-defaults --start-datetime='2021-04-15 17:13:06' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p35123512