從mysql全備 導入指定數據庫的數據:三種考慮方法


 

起因:

公司數據庫改造,需要將原有多個數據庫恢復到新的服務器上,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 <XXXXXXXX.sql >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 /data echo '---first sql----' mysql -uwsnimp -pXXXXX -hXXX --force<01_20190731_0600.sql if [ $? -eq 0 ]; then echo "==== ok!====" else echo "====failed!====" exit 1 fi echo '---second sql----' mysql -uwsnimp -pXXXX -hXXX --force<02_20190731_0600.sql if [ $? -eq 0 ]; then echo "==== ok!====" else echo "====failed!====" exit 1 fi echo '---third sql----' mysql -uwsnimp -pXXX -hXXX --force<03_20190731_0600.sql if [ $? -eq 0 ]; then echo "==== ok!====" else echo "====failed!====" exit 1 fi echo '---fourth sql----' mysql -uwsnimp -pXXX -hXXX --force<04_20190731_0600.sql if [ $? -eq 0 ]; then echo "====all ok!====" else echo "====failed!====" exit 1 fi

 補充:從日志中看到有報錯:

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 `類似的創建存儲過程或者函數的語句,這是由於導入使用的用戶沒有賦予存儲過程或者函數所在庫的權限,故報錯,選擇無視。

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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM