Mysql备份和恢复

一、数据备份的重要性

备份的主要目的是灾难恢复
在生产环境中,数据的安全性至关重要
任何数据的丢失都可能产生严重的后果

造成数据丢失的原因
1、程序错误
2、人为操作错误
3、运算错误
4、磁盘故障
5、灾难(火灾、地震、盗窃等)

二、数据库备份的分类

1、从物理与逻辑的角度,备份可分为

1、物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份

物理备份方法:
1.冷备份(脱机备份):是在关闭数据库的时候进行的
2.热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
3.温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作

2、逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份

2、从数据库的备份策略角度,备份可分为

1、完全备份:每次对数据库进行完整的备份

完全备份是对整个数据库、数据库结构和文件结构的备份。
保存的是备份完成时刻的数据库。
是差异备份与增量备份的基础。
相当于基石。

Mysql备份和恢复_第1张图片

2、差异备份:备份自从上次完全备份之后被修改过的文件

Mysql备份和恢复_第2张图片

3、增量备份:只要在上次完全备份或者增量备份后被修改的文件才会被备份

Mysql备份和恢复_第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

四、Mysql的完全备份备份和恢复

物理冷备份和恢复(物理备份-完全备份)

数据库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备份(逻辑备份)

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

Mysql备份和恢复_第4张图片

备份表:

mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql

mysqldump -uroot -p123123   mysql mysql_test > /opt/mysql-SCHOO ##导出mysql 库中的mysql_test 表到/opt/SCHOOL

Mysql备份和恢复_第5张图片

多表备份:

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备份和恢复_第6张图片

恢复数据库

##恢复库之前需要先创建一个名字一样的新库

mysql -u root -pabc123 < /opt/backup/kgc.sql   ##把之前备份到/opt/backup的kgc.sql库文件恢复到数据库中

备份这个sw库

Mysql备份和恢复_第7张图片

Mysql备份和恢复_第8张图片

 Mysql备份和恢复_第9张图片

恢复库中的表

##kgc库名称 

mysql -u root -pabc123 kgc < /opt/backup/kgc.sql  ##把备份的表导入kgc这个库中

Mysql备份和恢复_第10张图片

 Mysql备份和恢复_第11张图片

 Mysql备份和恢复_第12张图片

Mysql备份和恢复_第13张图片

备份一整个库  但是只恢复一张表

从备份的那个文件截取出那张表的信息单独领出来

 Mysql 日志

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

 Mysql备份和恢复_第14张图片

增量备份

开启二进制文件日志

vim /etc/my.cnf
[mysqld]
server-id = 1

log-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(混合模式),默认格式是STATEMENT

systemctl 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).sqlMysql备份和恢复_第15张图片

可每天进行增量备份操作,生成新的二进制日志文件(例如 mysql-bin.000004)

Mysql备份和恢复_第16张图片

插入新数据,以模拟数据的增加或变更

Mysql备份和恢复_第17张图片

 再次生成新的二进制日志文件(例如 mysql-bin.000005)

把刚才生成的00004二进制文件复制到/opt/目录下 (这个0004文件存放着刚才插入的两条数据st和jw)

一般恢复 

模拟丢失更改的数据的恢复步骤

Mysql备份和恢复_第18张图片

  mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -pMysql备份和恢复_第19张图片

断点恢复

Mysql备份和恢复_第20张图片

创建一个新表

 Mysql备份和恢复_第21张图片

 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

Mysql备份和恢复_第22张图片

恢复成功

 Mysql备份和恢复_第23张图片

 基于时间点恢复

#仅恢复到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

Mysql备份和恢复_第24张图片 

Mysql备份和恢复_第25张图片 

Mysql备份和恢复_第26张图片 

 

 

你可能感兴趣的:(数据库)