Mysql运维篇(三) MySQL备份与恢复

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除!

一、物理备份与逻辑备份

1、物理备份:备份数据文件,转储数据库物理文件到某一目录。物理备份恢复速度比较快,但占 用空间比较大,MySQL中可以用 xtrabackup 工具来进行物理备份。

2、逻辑备份:对数据库对象利用工具进行导出工作,汇总入备份文件内。逻辑备份恢复速度慢,但占用空间小,更灵活。MySQL 中常用的逻辑备份工具为 mysqldump 。逻辑备份就是 备份sql语句 ,在恢复的时候执行备份的sql语句实现数据库数据的重现。

二、MySQL实现逻辑备份

1、备份全部数据库

基本语法:

mysqldump --u 用户名称 --h 主机名称 --p密码 待备份的数据库名称[tbname, [tbname...]]> 备份文件名称.sql

说明: 备份的文件并非一定要求后缀名为.sql,例如后缀名为.txt的文件也是可以的。

2、备份全部数据库

使用mysqldump备份整个实例,可以使用 --all-databases 或 -A 参数:

mysqldump -uroot -pxxxxxx --all-databases > all_database.sql

mysqldump -uroot -pxxxxxx -A > all_database.sql

示例:

root@mysql8 backdata\]# mysqldump -uroot -p --all-databases \> all-databasesv2.sql ![](https://file.jishuzhan.net/article/1751776885928366082/c7d35aa84795983566ad5833a03b13b0.webp) **3、备份指定的数据库** 使用 --databases 或 -B 参数了,该参数后面跟数据库名称,多个数据库间用空格隔开。如果指定 databases参数,备份文件中会存在创建数据库的语句,如果不指定参数,则不存在。 语法如下: mysqldump --u user --h host --p --databases \[数据库的名称1 \[数据库的名称2...\]\] \> 备份文件名 称.sql 示例:备份test数据库 \[root@mysql8 backdata\]# mysqldump -uroot -hlocalhost -p --databases test \> test-db-v1.sql \[root@mysql8 backdata\]# mysqldump -uroot -hlocalhost -p -B test \> test-db-v2.sql ![](https://file.jishuzhan.net/article/1751776885928366082/e1d8a463af84ef4946b4c4b8b84bbdb4.webp) **4、备份指定数据库的部分表** 语法如下: mysqldump --u user --h host --p 数据库的名称 \[表名1 \[表名2...\]\] \> 备份文件名称.sql 示例:备份单个表 备份test数据库-my_table 表 \[root@mysql8 backdata\]# mysqldump -uroot -hlocalhost -p test my_table \> test-db-my_table.sql ![](https://file.jishuzhan.net/article/1751776885928366082/030bc5995f45d91d0b9fbd19271e811c.webp) 备份多个表 \[root@mysql8 backdata\]# mysqldump -uroot -hlocalhost -p test my_table sales \> test-db-my_tablev1.sql ![](https://file.jishuzhan.net/article/1751776885928366082/89667df3a419c005750f08d9207fc31f.webp) \[root@mysql8 backdata\]# vi test-db-my_tablev1.sql -------------------------------------------- ![](https://file.jishuzhan.net/article/1751776885928366082/1a10a11247265c581748011df8bfcd59.webp)![](https://file.jishuzhan.net/article/1751776885928366082/fc81842ad39fd1be1d15d411a5f2b6c0.webp) **5.备份单表的部分数据** 有些时候一张表的数据量很大,我们只需要部分数据。这时就可以使用 --where 选项了。where后面附带需要满足的条件。 示例:备份sales表中id = '1'的数据 \[root@mysql8 backdata\]# mysqldump -uroot -hlocalhost -p test sales --where="id=1" \> test-salesv1.sql ![](https://file.jishuzhan.net/article/1751776885928366082/098ca5fdeb4260fd859eaed411a68f1d.webp) ![](https://file.jishuzhan.net/article/1751776885928366082/f5d6eb512127ea695a4f820f4c99bff6.webp) ![](https://file.jishuzhan.net/article/1751776885928366082/cbd81d37cf255c0aaf6487e5ce51d989.webp) **6 数据库排除某些表的备份** 如果我们想备份某个库,但是某些表数据量很大或者与业务关联不大,这个时候可以考虑排除掉这些表,同样的,选项 --ignore-table 可以完成这个功能。 示例:备份test数据库,备份中不包含my_table表 ![](https://file.jishuzhan.net/article/1751776885928366082/c0414dff03bfc1341a7c7144c858a923.webp) \[root@mysql8 backdata\]# mysqldump -uroot -hlocalhost -p test --ignore-table test.my_table \> bknomy_tablev1.sql ![](https://file.jishuzhan.net/article/1751776885928366082/4c16c69f03b22a5a80e6ca6c4b1af7de.webp) ![](https://file.jishuzhan.net/article/1751776885928366082/3e9388020349b5ebdd49c2102be73e2e.webp) **7 只备份结构或只备份数据** 只备份结构的话可以使用 --no-data 简写为 -d 选项; \[root@mysql8 backdata\]# mysqldump -uroot -hlocalhost -p test --no-data \> nodatav1.sql ![](https://file.jishuzhan.net/article/1751776885928366082/756421f6f3dce735b217a05bce0b2ff1.webp) 只备份数据可以使用 --no-create-info 简写为-t 选项。 \[root@mysql8 backdata\]# mysqldump -uroot -hlocalhost -p test --no-create-info \> nocreatev1.sql ![](https://file.jishuzhan.net/article/1751776885928366082/f039966ff47522ab94a77e254fdc1c03.webp) ![](https://file.jishuzhan.net/article/1751776885928366082/fdccbe1837e900b2062bff1ce4e586f1.webp) **8 备份中包含存储过程、函数、事件** **mysqldump备份默认是不包含存储过程** ,自定义函数及事件的。可以使用 --routines 或 -R 选项来备份存储过程及函数,使用 --events 或 -E 参数来备份事件。 举例:备份整个atguigu库,包含存储过程及事件: ---后续补齐---- **9 mysqldump常用选项** [mysqldump 命令参数详解-腾讯云开发者社区-腾讯云](https://cloud.tencent.com/developer/article/1994050 "mysqldump 命令参数详解-腾讯云开发者社区-腾讯云") [MySQL--mysqldump命令详解-CSDN博客](https://blog.csdn.net/hshloveyy/article/details/129484795 "MySQL–mysqldump命令详解-CSDN博客") #### **三、数据库逻辑恢复** **数据库恢复基本语法:** mysql --u root --p \[dbname\] \< backup.sql 1、使用备份恢复单库 使用root用户,将之前练习中备份的all.sql文件中的备份导入数据库中,命令如下: 如果备份文件中包含了创建数据库的语句,则恢复的时候不需要指定数据库名称. 示例:备份全部数据库,删除test数据库,然后使用备份恢复 \[root@mysql8 backdata\]# mysqldump -uroot -p123456 --all-databases \> all-databasesv3.sql 删除前 VS 删除后 ![](https://file.jishuzhan.net/article/1751776885928366082/3552015049e54dcbfbba14ef69707229.webp)![](https://file.jishuzhan.net/article/1751776885928366082/9f450f5d07b088318eb8b36cd6f552e9.webp) 使用 all-databasesv3.sql进行恢复 \[root@mysql8 backdata\]# mysql -u root -p123456 \< all-databasesv3.sql ![](https://file.jishuzhan.net/article/1751776885928366082/69a92dae4ecbd9ad87f12e3a1d1ef0f7.webp)![](https://file.jishuzhan.net/article/1751776885928366082/e2cecc54fbfe3d70660425277d02f4e1.webp)![](https://file.jishuzhan.net/article/1751776885928366082/4f3136dfc0580631e9a6dbb8cd818181.webp) 2、从全量备份中恢复单库 示例:删除test数据库,从全量备份中只恢复test数据库 步骤一、删除test库并从全量备份中分离出test数据库数据信息。 ![](https://file.jishuzhan.net/article/1751776885928366082/8be3b6be1cf8b51e799575870dc94f74.webp) 将test数据库恢复信息与全量备份分离 > sed -n '/\^-- Current Database: \`test\`/,/\^-- Current Database: \`/p' all-databasesv3.sql \> test.sql 步骤二、使用分离的 test.sql数据信息进行数据库恢复 \[root@mysql8 backdata\]# mysql -uroot -p123456 \< test.sql ![](https://file.jishuzhan.net/article/1751776885928366082/93822f20ccbee84f8cd997a753e69e1f.webp) 报错网络说是时区的问题,有待验证? [Mysqldump时区差问题_!40103 set @old_time_zone=@@time_zone-CSDN博客](https://blog.csdn.net/qq_19800265/article/details/102861946 "Mysqldump时区差问题_!40103 set @old_time_zone=@@time_zone-CSDN博客") [https://www.cnblogs.com/mr-totoro/p/5807636.html](https://www.cnblogs.com/mr-totoro/p/5807636.html "https://www.cnblogs.com/mr-totoro/p/5807636.html") ![](https://file.jishuzhan.net/article/1751776885928366082/5f77075bb5e69a84d3f12c9339228ca6.webp) 3、从单库备份中恢复单表 ![](https://file.jishuzhan.net/article/1751776885928366082/b947ef9fe64f75041ebded6f46f0ed00.webp)![](https://file.jishuzhan.net/article/1751776885928366082/b947ef9fe64f75041ebded6f46f0ed00.webp) 步骤一: 获取MySQL 表结构 \[root@mysql8 backdata\]# cat all-databasesv3.sql \| sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE \`my_table\`/!d;q' \>my_table.sql ![](https://file.jishuzhan.net/article/1751776885928366082/851371e28f40b13300583cb5aff13aa5.webp) 获取MySQL 表中的数据 \[root@mysql8 backdata\]# cat all-databasesv3.sql \| grep --ignore-case 'insert into \`my_table\`' \> my_table_data.sql ![](https://file.jishuzhan.net/article/1751776885928366082/482f177420e9773429e5aff454cb9ba1.webp) 步骤二、使用生成的数据进行恢复 -rw-r--r-- 1 root root 431 Jan 29 01:51 my_table.sql -rw-r--r-- 1 root root 64 Jan 29 01:51 my_table_data.sql ![](https://file.jishuzhan.net/article/1751776885928366082/8aad15e28accff21178058d92531a471.webp)![](https://file.jishuzhan.net/article/1751776885928366082/5475a430109c2ce22079c5181d8ddf9b.webp) ##### 四、物理备份:直接复制整个数据库 (InnoDB存储引擎的表不适用) ![](https://file.jishuzhan.net/article/1751776885928366082/4192b13086b8fc179aad985101f56e08.webp) **物理恢复:直接复制到数据库目录** ![](https://file.jishuzhan.net/article/1751776885928366082/f2026cbe6c00d8d8df3cc246c7180bbf.webp)

相关推荐
xyliiiiiL3 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing5 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
用户6279947182626 分钟前
南大通用GBase 8s 获取表的约束与索引列信息
数据库
Arbori_2621524 分钟前
获取oracle表大小
数据库·oracle
王强你强31 分钟前
MySQL 高级查询:JOIN、子查询、窗口函数
数据库·mysql
草巾冒小子32 分钟前
brew 安装mysql,启动,停止,重启
数据库·mysql
用户62799471826239 分钟前
南大通用GBase 8c分布式版本gha_ctl 命令-HI参数详解
数据库
斯汤雷1 小时前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
SQLplusDB1 小时前
Oracle 23ai Vector Search 系列之3 集成嵌入生成模型(Embedding Model)到数据库示例,以及常见错误
数据库·oracle·embedding
喝醉酒的小白1 小时前
SQL Server 可用性组自动种子设定失败问题
数据库