mysql数据库备份的多种方法

1.数据库备份的重要性

(1)提高系统的高可用性和灾难可恢复性,在系统数据库奔溃时,没有数据库备份就无法找到数据
(2)使用数据库备份还原数据库,时数据库奔溃时提供数据恢复最小代价的最优方案
(3)没有数据就没有一切,数据备份是一种灾难防范的强力手段

2.数据库的备份分类

(1)物理备份:对数据库进行物理文件(数据文件、日志文件等)的备份
(2)逻辑备份:对数据逻辑组件(表、库等数据库对象)的备份
(3)完全备份:每次对数据库进行完整的备份
优点:备份与恢复操作简单
缺点:数据大量重复,占空间大和耗时间长
(4)差异备份:备份从上次完全备份后被修改过的文件
(5)增量备份:备份从上次完全备份或增量备份后被修改的文件

3.常见的备份方法

(1)物理冷备:

备份时数据库处于关闭状态,直接打包数据库文件备份速度快,恢复也简单
tar命令即可

(2)专用备份工具mydump,mydump是mysql自带的常用逻辑备份工具

####mysqldump备份与恢复###
将指定的库、表、或全部的库导出为SQL脚本
#####备份操作#####
mysqldump备份需要和mysql进行数据交互,如果关闭mysql 则无法备份和恢复
mysqldump [选项] 库名 [表名1] [表名2] … > /备份路径/备份文件名 #对表进行备份
mysqldump [选项] --databases 库名1 [库名2] … > /备份路径/备份文件名 #对单库或多库进行备份
mysqldump [选项] --all-databases > /备份路径/备份文件名 #对全部库进行备份

我们可以看看脚本内的内容
mysqldump -u root -p --databases auth > /opt/auth.sql ####备份auth数据库文件到/opt/auth.sql
cat /opt/auth.sql | grep -v “^–” | grep -v “^/” | grep -v “^$”
CREATE DATABASE /!32312 IF NOT EXISTS/ auth /*!40100 DEFAULT CHARACTER SET utf8 */; #如每有库auth则创建库auth
USE auth; #选择auth库
DROP TABLE IF EXISTS users; #如存在则删除表users
CREATE TABLE users ( #创建新表users
user_name char(16) NOT NULL,
user_passwd char(48) DEFAULT ‘’,
PRIMARY KEY (user_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
LOCK TABLES users WRITE; #锁表
INSERT INTO users VALUES (‘lisi’,’*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9’), #插入数据(‘zhangsan’,’*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9’);
UNLOCK TABLES; #解锁表

这样我们对如何恢复表的过程就很清楚了

恢复命令
mysql -u root -p < /opt/auth.sql #也可以在mysql里mysql> source /opt/auth.sql; 进行恢复

(3)启用二进制日志进行增量备份

1.二进制日志保存了所有更新或可能更新数据库的操作
2.二进制日志在启动mysql服务后开始记录,并在文件达到max_binlog_size所设置的大小或者接受到flish-logs命令后重新创建新的日志文件
3.只需定时执行flush-logs方法重新建立新的日志,并及时把旧的日志文件保存到安全的地方旧完成了一个时间段的增量备份
MySQL数据库增量备份恢复

1.需要先开启二进制日志功能

vim /etc/my.cnf
[mysqld] #####找到这个模块
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-bin=/usr/local/mysql/data/mysql-bin ###添加开启二进制日志功能
systemctl restart mysqld
ll /usr/local/mysql/data/ #查看是否开启成功
-rw-r-----. 1 mysql mysql 154 9月 13 16:05 mysql-bin.000001
-rw-r-----. 1 mysql mysql 39 9月 13 16:05 mysql-bin.index

2.进行一次完全备份

###mysql> flush tables with read lock; #####关闭所有打开的表并使用全局读锁锁定所有数据库的所有表
mysql> flush tables user_info with read lock; #对表 user_info加锁,防止其它程序更新表
[root@localhost mysql]# mysqldump -u root -p client user_info > /backup/client_userinfo-$(date +%F).sql

3.保存新的二进制日志文件进行一次增量备份

[root@localhost mysql_bak]# mysqladmin -u root -p flush-logs #刷新保存二进制日志文件
[root@localhost mysql_bak]# mysql -u root -p
mysql> unlock tables; #######解除表锁
mysql> use client;
mysql> insert into user_info values(‘000009’,‘赵六’,‘男’,‘019’,‘37’);
mysql> insert into user_info values(‘000010’,‘孙七’,‘男’,‘020’,‘36’);
[root@localhost mysql_bak]# mysqladmin -u root -p flush-logs
[root@localhost mysql]# cp /usr/local/mysql/data/mysql-bin.000002 /backup/

4.模拟误操作删除user_info表

[root@localhost mysql_bak]# mysql -u root -p -e ‘drop table client.user_info’
[root@localhost mysql_bak]# mysql -u root -p -e ‘select * from client.user_info’
Enter password:
ERROR 1146 (42S02) at line 1: Table ‘client.user_info’ doesn’t exist

5.恢复故障

[root@localhost mysql]# mysql -u root -p client < /backup/client_userinfo-2020-10-13.sql #全量恢复
Enter password:
[root@localhost mysql]# mysql -u root -p -e’select * from client.user_info’
Enter password:
±----------±-------±-------±------------±-------+
| 身份证 | 姓名 | 姓别 | 用户ID号 | 资费 |
±----------±-------±-------±------------±-------+
| 000006 | 张三 | 男 | 016 | 10 |
| 000007 | 李四 | 女 | 017 | 91 |
| 000008 | 王五 | 女 | 018 | 23 |
±----------±-------±-------±------------±-------+

[root@localhost mysql]# mysqlbinlog --no-defaults /backup/mysql-bin.000002 | mysql -u root -p #增量恢复
Enter password:
[root@localhost mysql]# mysql -u root -p -e’select * from client.user_info’
Enter password:
±----------±-------±-------±------------±-------+
| 身份证 | 姓名 | 姓别 | 用户ID号 | 资费 |
±----------±-------±-------±------------±-------+
| 000006 | 张三 | 男 | 016 | 10 |
| 000007 | 李四 | 女 | 017 | 91 |
| 000008 | 王五 | 女 | 018 | 23 |
| 000009 | 赵六 | 男 | 019 | 37 |
| 000010 | 孙七 | 男 | 020 | 36 |
±----------±-------±-------±------------±-------+

6.基于位置恢复

重复操作第4和第5步骤的全量恢复,回到增量恢复前 #步骤省略
要基于位置恢复,我们先来研究下二进制日志文件mysql-bin.000002
[root@localhost mysql]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /backup/mysql-bin.000002
/!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1/;
/!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0/;
DELIMITER /!/;
# at 4
#201013 15:55:34 server id 1 end_log_pos 123 CRC32 0x063be67c Start: binlog v 4, server v 5.7.20-log created 201013 15:55:34
# at 123
#201013 15:55:34 server id 1 end_log_pos 154 CRC32 0x338cb436 Previous-GTIDs
# [empty]
# at 154
#201013 15:59:04 server id 1 end_log_pos 219 CRC32 0x2cc08544 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=yes
/!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED//!/;
SET @@SESSION.GTID_NEXT= ‘ANONYMOUS’/!/;
# at 219
#201013 15:59:04 server id 1 end_log_pos 293 CRC32 0x1cecf821 Query thread_id=7 exec_time=0 error_code=0
SET TIMESTAMP=1602575944/!/;
SET @@session.pseudo_thread_id=7/!/;
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/!/;
BEGIN
/!/;
# at 293
#201013 15:59:04 server id 1 end_log_pos 359 CRC32 0xd86fdb12 Table_map: client.user_info mapped to number 523
# at 359
#201013 15:59:04 server id 1 end_log_pos 421 CRC32 0x958ed874 Write_rows: table id 523 flags: STMT_END_F
### INSERT INTO client.user_info
### SET
### @1=‘000009’
### @2=‘赵六’
### @3=‘男’
### @4=‘019’
### @5=37
# at 421
#201013 15:59:04 server id 1 end_log_pos 452 CRC32 0xfe6b8f8b Xid = 52
COMMIT/!/;
# at 452
#201013 15:59:09 server id 1 end_log_pos 517 CRC32 0xec7cb48e Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=yes
/!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED//!/;
SET @@SESSION.GTID_NEXT= ‘ANONYMOUS’/!/;
# at 517
#201013 15:59:09 server id 1 end_log_pos 591 CRC32 0x1666e271 Query thread_id=7 exec_time=0 error_code=0
SET TIMESTAMP=1602575949/!/;
BEGIN
/!/;
# at 591
#201013 15:59:09 server id 1 end_log_pos 657 CRC32 0x6b6d8472 Table_map: client.user_info mapped to number 523
# at 657
#201013 15:59:09 server id 1 end_log_pos 719 CRC32 0x4faa6bb9 Write_rows: table id 523 flags: STMT_END_F
### INSERT INTO client.user_info
### SET
### @1=‘000010’
### @2=‘孙七’
### @3=‘男’
### @4=‘020’
### @5=36
# at 719
#201013 15:59:09 server id 1 end_log_pos 750 CRC32 0x9f95319c Xid = 53
COMMIT/!/;
# at 750
#201013 15:59:41 server id 1 end_log_pos 797 CRC32 0xc5f7f7b1 Rotate to mysql-bin.000003 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/;

在每条记录被写入表的过程中,它其实是一个事件,从BEGIN开始,到COMMIT/!/;结束
其中有很多位置节点# at 517等等 和很多时间节点#201013 15:59:09等。我们基于位置恢复和时间恢复,需要用到这些节点

位置恢复有两种命令来恢复
[root@localhost mysql]# mysqlbinlog --no-defaults --stop-position=‘452’ /backup/mysql-bin.000002 |mysql -u root -p #从开始位置恢复到452节点结束
[root@localhost mysql]# mysql -u root -p -e’select * from client.user_info’
Enter password:
±----------±-------±-------±------------±-------+
| 身份证 | 姓名 | 姓别 | 用户ID号 | 资费 |
±----------±-------±-------±------------±-------+
| 000006 | 张三 | 男 | 016 | 10 |
| 000007 | 李四 | 女 | 017 | 91 |
| 000008 | 王五 | 女 | 018 | 23 |
| 000009 | 赵六 | 男 | 019 | 37 |
±----------±-------±-------±------------±-------+
赵六被恢复

[root@localhost mysql]# mysqlbinlog --no-defaults --start-position=‘517’ /backup/mysql-bin.000002 |mysql -u root -p #从517开始恢复到末尾结束
Enter password:
[root@localhost mysql]# mysql -u root -p -e’select * from client.user_info’
Enter password:
±----------±-------±-------±------------±-------+
| 身份证 | 姓名 | 姓别 | 用户ID号 | 资费 |
±----------±-------±-------±------------±-------+
| 000006 | 张三 | 男 | 016 | 10 |
| 000007 | 李四 | 女 | 017 | 91 |
| 000008 | 王五 | 女 | 018 | 23 |
| 000009 | 赵六 | 男 | 019 | 37 |
| 000010 | 孙七 | 男 | 020 | 36 |
±----------±-------±-------±------------±-------+
孙七被恢复

7.基于时间恢复,

mysqlbinlog --no-defaults --start-datetime=‘年-月-日 时:分:秒’ 二进制日志文件 | mysql -u root -p 密码
mysqlbinlog --no-defaults --stop-datetime=‘年-月-日 时:分:秒’ 二进制日志文件 | mysql -u root -p 密码
mysqlbinlog --no-defaults --start-datetime=‘年-月-日 时:分:秒’ --stop-datetime=‘年-月-日 时:分:秒’ 二进制日志文件 | mysql -u root -p 密码

猜你喜欢

转载自blog.csdn.net/weixin_41648905/article/details/109076845