一、从全量备份中恢复单库
方法一: 使用 --one-database 直接单库恢复 【推荐👍】
恢复前 库不存在的话要手动新建; create database 库名;
mysql -uroot -p 库名 --one-database < all.sql方法二: 恢复单库还可采用手动筛选的方法。通过 sed 筛选出 sql
恢复前 库不存在的话要手动新建; create database 库名;
sed -n '/^-- Current Database: `库名`/,/^-- Current Database: `/p' all.sql > 单库.sql
mysql -uroot -p 库名 < 单库.sql⚠️注意事项:
1、sql 导入的时候 ,表 A 有外键引用表 B,但表 B 的定义在表 A 之后才出现,就会导致导入报错:"Failed to open the referenced table"
2、备份文件中记录的时间戳数据都是以0时区为基础的。如果直接执行筛选出的SQL,就会造成0时区的时间戳插入的东八区的系统中,会造成时间相差8小时的问题。
解决办法:
mysqldump 的备份数据的时候,会配置的SET语句,其核心作用是在脚本执行期间调整数据库参数,并在完成后恢复原始设置。 有了这些参数就可以解决上面的问题。
在 sql 的头部和尾部都加上 一些参数:下面的这些参数都需要去获取,不能直接使用
- 从完整的备份sql中获取头部的SET 语句:
head -20 all.sql
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;- 把这些SET 语句写入到 单库.sql文件中
vim 单库.sql
xxxx- 从完整的备份sql中获取尾部的SET 语句:
tail -n 20 all.sql
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;- 把这些参数写入到 单库.sql文件中
vim 单库.sql
xxxx- 恢复单库数据
> source 单库.sql二、从单库备份中恢复单表
使用Shell命令cat导出表test_tb的 结构和数据。
其中test_tb_info.sql文件中存储的是表class的结构,test_tb_data.sql文件中存储的是表class中的数据
# 从单库的备份sql中筛选test_db建表及插数据语句
cat 单库.sql | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `test_tb`/!d;q' > test_tb_info.sql
cat 单库.sql | grep --ignore-case 'insert into `test_tb`' > test_tb_data.sql
#使用source 命令导入表class的结构和数据
> source test_tb_info.sql
> source test_tb_data.sql三、关于SET 语句参数说明




本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟