博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从mysql全备 导入指定数据库的数据:三种考虑方法
阅读量:5327 次
发布时间:2019-06-14

本文共 2502 字,大约阅读时间需要 8 分钟。

 

起因:

公司数据库改造,需要将原有多个数据库恢复到新的服务器上,DBA同事提供给我的其他来源数据库备份均为全备。但是要求并不是全库恢复至新服务器。

mysql版本:5.6.43-log

----------------

处理过程:

在这个前提下尝试了三种方法恢复:

注意:在导入前禁用外键,防止导入过程中外键校验导致建表失败,导入完成后开启外键:

set foreign_key_checks=0; -- 禁用外键
set foreign_key_checks=1; -- 开启外键

  

(1)使用--one-database参数导入dysub数据

nohup mysql -uwsnimp -pXXXXXX -hXXXXXX dysub --one-database 
err_wsnimp_XXX.log &

  结论:此种方式可导入指定数据库的全部数据,但是对于非指定数据库的数据库也会被建立,但没有表和数据信息,不推荐。

 

(2)使用sed命令从备份文件中摘出来指定数据库的相关sql语句:

匹配出dysub库相关语句:sed -n '/^-- Current Database: `dysubprod`/,/^-- Current Database: `/p' XXXXXXX.sql > dysubbak_20190801.sql &如果是指定多个库,用;分隔多个匹配的命令即可:sed -n '/^-- Current Database: `dysub1`/,/^-- Current Database: `/p;/^-- Current Database: `dysub2`/,/^-- Current Database: `/p' XXXXXXX.sql >dysubbak_20190801.sql &

   结论:此种方式可较快处理问题,经测试即使SQL文件很大(几十G是完全没问题的),也可以用sed快速输出匹配的sql命令行。强烈推荐!

 

(3)在库中先建一个用户导入数据的用户,赋予需要导入数据库的权限:

此处我赋予的是all 权限: grant all privileges on dysubprod.* to wsnimp@'%' identified by 'Passw0rd#'; flush privileges;
数据导入,如果不加force 命令会异常中断,因为对于没有权限的库都是导入失败的: nohup mysql -uwsnimp -pPassw0rd# -hXXXXXX --force< pdms_bak.sql >err_pdmsimp.log &

  结论:此种方法同样是推荐的。

(4)由于有多个源端的全备文件,用sed也需要一个个匹配重定向到新文件里,可以采用追加到同一个文件方式,然后最终一次执行。

此次问题处理过程中因为多源+多库,我采用了第三种方式:只需要赋予指定库的权限,然后写个简单的小脚本nohup一次执行即可,

可以从输出的日志中看出来SQL文件执行到第几个以及执行成功与否:

nohup ./wsnimp.sh >err_wsnimp_201907310945.log & #!/bin/sh ##wsnimp.sh cd /dataecho '---first sql----'mysql -uwsnimp -pXXXXX -hXXX --force<01_20190731_0600.sqlif [ $? -eq 0 ]; then        echo "==== ok!===="else        echo "====failed!===="        exit 1fiecho '---second sql----'mysql -uwsnimp -pXXXX -hXXX --force<02_20190731_0600.sqlif [ $? -eq 0 ]; then        echo "==== ok!===="else        echo "====failed!===="        exit 1fiecho '---third sql----'mysql -uwsnimp -pXXX -hXXX --force<03_20190731_0600.sqlif [ $? -eq 0 ]; then        echo "==== ok!===="else        echo "====failed!===="        exit 1fiecho '---fourth sql----'mysql -uwsnimp -pXXX -hXXX --force<04_20190731_0600.sqlif [ $? -eq 0 ]; then        echo "====all ok!===="else        echo "====failed!===="        exit 1fi

 补充:从日志中看到有报错:

ERROR 1227 (42000) at line 1781: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

这个报错是没有super权限,根据报错信息中提示的line 去sql语句文件中找到对应的sql信息,

sed -n '1600,1900p;' 01_20190731_0600.sql >test.txt
结果显示均为:CREATE DEFINER=`root`@`%` PROCEDURE `类似的创建存储过程或者函数的语句,这是由于导入使用的用户没有赋予存储过程或者函数所在库的权限,故报错,选择无视。

----------------

 

----------------

转载于:https://www.cnblogs.com/wsn-only/p/11283008.html

你可能感兴趣的文章
加固linux
查看>>
WPF中Image显示本地图片
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
js千分位处理
查看>>
字符串类型的相互转换
查看>>
基础学习:C#中float的取值范围和精度
查看>>
Vim配置Node.js开发工具
查看>>
web前端面试题2017
查看>>
ELMAH——可插拔错误日志工具
查看>>
MySQL学习笔记(四)
查看>>
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
SOPC Builder中SystemID
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>
RxJS & Angular
查看>>
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>