起因:
公司數據庫改造,需要將原有多個數據庫恢復到新的服務器上,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 `類似的創建存儲過程或者函數的語句,這是由於導入使用的用戶沒有賦予存儲過程或者函數所在庫的權限,故報錯,選擇無視。
----------------
----------------