八、MySQL备份与数据恢复

目录

一、物理备份和逻辑备份的区别:

1、逻辑备份(热备)

2、物理备份(冷备)

3、温备

二、mysqldump逻辑备份

1、mysqldump的基本语法:

2、数据备份

3、数据恢复

 三、mysqldump全量备份 + mysqlbinlog增量备份

1、全量备份

2、增量备份

3、数据恢复

4、mysqldump备份存储过程

5、mysql备份用户数据


一、物理备份和逻辑备份的区别:

1、逻辑备份(热备)

        在线备份

        对应用基本无影响

优点:

        备份成sql文件,恢复数据很简单。

        逻辑备份与存储引擎无关,所以可以通用备份。

        有助于避免数据损坏。

缺点:

        数据恢复速度较慢。

        需要数据库服务正常时安排cpu去进行还原操作。

2、物理备份(冷备)

        备份数据文件

        需要停机

        备份datadir目录下所有文件,

优点:

        容易跨平台,基于文件的物理备份。

        恢复数据很快,实际上就是将备份文件拷贝回原路径。

缺点:

        数据量大的话文件大。

        备份文件存储在磁盘本地,如果磁盘出问题容易造成备份文件丢失。

3、温备

        在线备份

        对应用影响大

        通常加一个读锁

二、mysqldump逻辑备份

        mysqldump是mysql自带的一个简单的备份工具,由于操作简单而且对不同的存储引擎通用,所以比较受欢迎。逻辑备份实际上是将数据库的数据被分成一个sql文件,然后恢复数据时只需要用图形化工具导入这个sql文件或者dos下使用source命令引入就可恢复数据。

1、mysqldump的基本语法:

mysqldump --single-transaction(必加) -uroot -proot -h127.0.0.1 -P3306 test test> test.sql

1、备份 test 数据库的 触发器、存储过程、定时任务,并且压缩
mysqldump -u root -p --set-gtid-purged=OFF --single-transaction  --triggers --master-data -R -E -B test | gzip > test.backup.gz

2、将备份的数据传输到另一台机器上
[root@rabbitmq_1 tmp]# mysqldump --single-transaction --set-gtid-purged=OFF --master-data --triggers -R -E -B test | gzip -c | ssh root@rabbitmq_2 'cat > /tmp/sbtest.sql.gz'

常用参数:
--single-transaction 参数用于确保在备份过程中数据库处于一致状态,这是在执行事务性数据库备份时非常重要的。
-A:备份全部数据库。
--all-databases:备份全部数据库。
-B:备份哪几个数据库
-t:不导出创建表的语句。
-d:不导出数据。
-R,--routines:导出存储过程和函数。
-E:--evens 备份定时任务
-w "a=1":解释加where条件,值备a=1的数据
--default-character-set:指定编码
--result-file:指定导出文件路径及文件名。
--skip-triggers:不导出触发器。
--master-data=[0][1][2] #在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息,通常情况下=1 就行了
    # 0: 不记录
    # 1:记录CHANGE MASTER语句
    # 2:记录但注释CHANGE MASTER语句

--no-data:不备份数据。
--no-create-db:不备份数据库创建语句。
--skip-comments:跳过备份文件中的注释。
--skip-lock-tables:备份时不锁定表。
--no-create-info:不备份表结构。
--triggers:备份触发器。
--result-file:指定备份结果保存到的文件。

--set-gtid-purged=OFF:mysql导出时加 --set-gtid-purged=OFF,导入新数据库时,会触发记录到新数据库的binlog日志。如果不加,则新数据库不记录binlog日志。
所以做主从时用了gtid,用mysqldump备份时就要加--set-gtid-purged=OFF,否则在主上导入恢复了数据,主没有了binlog日志,同步则不会被同步。

2、数据备份

使用mysqldump是可以进行多种不同方案的备份的。

(1) 全库备份:使用全库备份会将所有数据库中的数据全部备份到同一个sql文件中。
mysqldump -uroot -p -h192.168.134.132 -P3306 --all-databases > /tmp/all.sql

(2) 备份单个数据库:将lxy数据库中的数据备份到sql文件lxy.sql中。
mysqldump -uroot -p -h49.235.28.88 -P3306 lxy > /usr/local/lxy.sql

(3) 备份lxy数据库中的users表到user_test.sql文件。
mysqldump -uroot -p -h49.235.28.88 -P3306 lxy users> /usr/local/user_test.sql

(4) 只备份lxy数据库的表结构,不备份数据到lxy1.sql文件中。
mysqldump -uroot -p -h49.235.28.88 -P3306 lxy -d> /usr/local/lxy1.sql

(5) 备份lxy数据库的表结构和存储过程,不备份数据到lxy2.sql中。
mysqldump -uroot -p -h49.235.28.88 -P3306 lxy -d -R> /usr/local/lxy2.sql

(6) 不备份表结构,只备份数据到lxy3.sql。
mysqldump -uroot -p -h49.235.28.88 -P3306 lxy -t> /usr/local/lxy3.sql

3、数据恢复

表级恢复

(1) 登录mysql,选择对应的数据库,然后设置编码。

(2) 使用source命令导入备份数据。

source /usr/local/all.sql

单库恢复

(1) 登录Mysql,删除要恢复的旧数据库。

(2) 使用source命令导入备份数据。

全库恢复

(1) 退出mysql,使用mysql命令恢复数据。

mysql < /usr/local/all.sql -p

然后在控制台输入密码,密码不会显示别以为没有输入成功。

压缩数据文件恢复

gunzip < test.backup.tgz > a.sql
mysql < a.sql;
h或者
gunzip < test.backup.tgz | mysql -uroot -p12356
    

 三、mysqldump全量备份 + mysqlbinlog增量备份

        刚才已经将mysql全量备份及数据恢复的方式讲完了,可以发现mysqldump的使用方式很简单,但是使用mysqldump进行数据备份会存在一个问题:恢复数据时会丢失掉从备份点开始的更新数据,所以我们需要结合mysqlbinlog进行二进制日志增量备份,

        首先修改/etc/my.cnf文件,在[mysqld]下启用二进制日志:

        log_bin=mysql-bin #开启二进制日志,

        数据库的任何更新操作都会记录到二进制日志中。

        接下来看下mysqldump全量备份 + mysqlbinlog增量备份如何进行操作:

1、全量备份

mysqldump -uroot -p --flush-logs --single-transaction --master-data=2 databaseName tax-disk > /tmp/tax-disk.sql
# databaseName 备份的数据库
# --flush-logs参数生成新的二进制日志文件
# /home/sql/test.sql 备份的文件路径及文件
# --single-transaction:该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。
# --master-data=[0][1][2] #在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
# 0: 不记录
# 1:记录CHANGE MASTER语句
# 2:记录但注释CHANGE MASTER语句

2、增量备份

1、开启mysql的binlog日志(增量备份)

1.1查看是否开启,mysql8 默认是开启的,如果没有开启,就编辑 vim /etc/my.cnf文件 添加
        #节点Id,注意集群中不能重复,单节点不配置也可以
        server-id=123
        #开启binlog日志,指定其存放位置
        log-bin=/var/lib/mysql/mysql-bin
        #开启binlog自动过期
        expire_logs_days=3

1.2重启数据库:service mysqld restart

1.3然后在查看是否开启
mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name                   | Value                          |
+---------------------------------+--------------------------------+
| log_bin                         | ON                             |
| log_bin_basename                | /var/lib/mysql/mysql-bin      日志文件 
| log_bin_index                   | /var/lib/mysql/mysql-bin.index  是索引
| log_bin_trust_function_creators | OFF                            |
| log_bin_use_v1_row_events       | OFF                            |
| sql_log_bin                     | ON                             |
+---------------------------------+--------------------------------+
1.2 rows in set (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000056 |      155 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql-bin是日志文件 、000056是索引、pos=155是事件位置也可以叫偏移值

- - - -做一次 增量备份

1、查看binlog
mysql> show master logs;
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+

| mysql-bin.000072 |    523978 | No        |
| mysql-bin.000073 |       381 | No        |
+------------------+-----------+-----------+

14 rows in set (0.00 sec)

2、全量备份所有库,并刷新binlog
[root@rabbitmq_1 tmp]#  mysqldump -uroot -p123456 -P3306 -F --all-databases > /tmp/all.sql;
[root@rabbitmq_1 tmp]# mysqldump -uroot -p123456 --flush-logs --single-transaction --master-data=2  -B online_invoice > /tmp/online_invoice.sql

3、再次查看binlog,多出了一条mysql-bin.000074
mysql> show master logs;
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+

| mysql-bin.000072 |    523978 | No        |
| mysql-bin.000073 |       428 | No        |
| mysql-bin.000074 |       155 | No        |
+------------------+-----------+-----------+
15 rows in set (0.00 sec)

4、创建一个表 添加测试数据
CREATE TABLE dept( deptno INT PRIMARY KEY, dname VARCHAR(14), loc VARCHAR(13));
INSERT INTO dept VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO dept VALUES(20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES(30,'SALES','CHICAGO');
INSERT INTO dept VALUES(40,'OPERATIONS','BOSTON');

5、删除数据库
mysql> show databases;

+------------------------+
| Database               |
+------------------------+

| newtaxcontrol-server   |
| newtaxcontrol-weixin   |
| online_invoice         |

+------------------------+
12 rows in set (0.00 sec)
12 rows in set (0.00 sec)

mysql> drop database online_invoice;
Query OK, 58 rows affected (0.51 sec)

        所以说实际上备份有两个文件:mysqldump全量备份生成的/tmp/online_invoice.sql以及二进制日志文件/var/lib/mysql/mysql-bin.000073文件。所以恢复数据时,我们需要分成两部分去进行恢复数据:

3、数据恢复

1、先刷新下日志,此时会生成一个新的日志文件mysql-bin.000075 ,就是为了方便我们分析上一个文件mysql-bin.000074
mysql> flush logs;

2、查看mysql-bin.000075
方式一:
#-vvv :查看sql,方便判断pos点
#--base64-output=decode-rows :  base64编码的数据转成row
mysqlbinlog -vvv --base64-output=decode-rows   mysql-bin.000074

方式二:
mysql> show binlog events in 'mysql-bin.000074';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                                                
| mysql-bin.000074 | 1789 | Query          |         1 |        1923 | drop database online_invoice /* xid=15868 */                                                                         |
| mysql-bin.000074 | 1923 | Rotate         |         1 |        1970 | mysql-bin.000075;pos=4 
--------------------------------------------------------------------------------------+
31 rows in set (0.00 sec)

(root@localhost) [test]> show binlog events in 'mysql-bin.000137';
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                                                          |
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------------------------------+

| mysql-bin.000137 | 1444 | Query          |         1 |        1519 | BEGIN                                                                                         |
| mysql-bin.000137 | 1519 | Table_map      |         1 |        1579 | table_id: 96 (test.t_stu)                                                                     |
| mysql-bin.000137 | 1579 | Delete_rows    |         1 |        1646 | table_id: 96 flags: STMT_END_F                                                                |
| mysql-bin.000137 | 1646 | Xid            |         1 |        1677 | COMMIT /* xid=74 */                                                                           |
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------------------------------+
17 rows in set (0.01 sec)


恢复时需要在binlog中找到两个位置:
    1、数据恢复的起始位置
    2、数据恢复的结束位置
    如:在数据准备中的drop操作,需要在binlog中找到该位置,并将该位置作为数据恢复的结束位置
    找到问题pos在1789~1923之间,所以将数据恢复到1789之前就可以了。

3、恢复数据

3.1 先恢复全量备份的数据:
[root@rabbitmq_1 tmp]# mysql -uroot -p -v  < online_invoice.sql
然后输入密码确认恢复数据。

或者

source命令:登录数据库,执行下述命令:
mysql> source /tmp/online_invoice.sql
此时 恢复的库里边 是没有刚才新创建的表 和数据的

3.2 然后恢复增量备份:

增量数据恢复就是恢复binlog中记录的数据,

[root@rabbitmq_1 mysql]# mysqlbinlog --stop-position=1789 -d online_invoice  mysql-bin.000074 | mysql -uroot -p123456
mysqlbinlog恢复数据常用参数:
--start-position=875 起始pos点
--stop-position=954 结束pos点
--start-datetime="2016-9-25 22:01:08" 起始时间点
--stop-datetime="2019-9-25 22:09:46" 结束时间点
--skip-gtids 是忽略GTIDs报错
-d 指定数据库

 或者  通过mysqlbinlog 将log文件,转化为sql文件,方便查询

 [root@rabbitmq_1 mysql]# mysqlbinlog --stop-position=1789 -d online_invoice  mysql-bin.000074 > ./test.sql
 [root@rabbitmq_1 mysql]# mysql -uroot -p123456 < ./test.sql
 
  恢复完之后再查询  刚才创建的表和数据已经恢复
  博客有详解:
  https://blog.csdn.net/Jokers_lin/article/details/126449539

4、mysqldump备份存储过程

mysqldump -u <username> -p<password> --routines --no-create-info --no-data --no-create-db <database_name> > <backup_file.sql>
命令中的参数解释如下:
--routines:指定备份存储过程。
--triggers  指定备份触发器
--no-create-info:不包含创建表的信息。
--no-data:不包含表中的数据。
--no-create-db:在导出时不包含创建数据库的语句。
--no-create-db:在导出时不包含创建数据库的语句。
举个例子,假设您的用户名是 root,密码是 password,要备份的数据库名是 mydatabase,您可以执行以下命令来备份存储过程:
mysqldump -u root -p password --routines --no-data --no-create-info --no-create-db mydatabase >back.sql

5、mysql备份用户数据

mysqldump -u <username> -p<password> --no-create-info --no-create-db --where="user='<user_name>'" <database_name> > <backup_file.sql>
将 <username> 替换为您的 MySQL 用户名,<password> 替换为您的密码,<user_name> 替换为要备份数据的用户名称,<database_name> 替换为要备份数据的数据库名称,<backup_file.sql> 替换为您要保存备份的文件路径和文件名。
例如,假设您的用户名是 root,密码是 password,要备份的数据库名是 mydatabase,要备份的用户是 myuser,您可以执行以下命令来备份用户数据:
mysqldump -u root -ppassword --no-create-info --no-create-db --where="user='myuser'" mydatabase > backup.sql
执行该命令后,特定用户的数据将被导出到 backup.sql 文件中。

原创不易,如文章存在问题,请及时通知我改正,大家互相进步。 

  • 38
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁华依在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值