Mysql
Mysqldump 在單個事務中使用 where 子句的多個表
假設我們有 2 個表:數據庫db中的****t1,t2:期望下面的程式碼根據子句中指定的條件轉儲表:
where
mysqldump --login-path=login_path \ --single-transaction db t1 \ --where="user_id>200" , t2 --where="id>200" > /tmp/users_data.sql
但是會彈出以下錯誤:
mysqldump: 無法執行 ‘SELECT /*!40001 SQL_NO_CACHE */ * FROM t1 WHERE id>200 Unknown column ‘id’ in ‘where Clause’ (1054)
如何正確使用
where
子句轉儲多個表mysqldump
?如果不可能,是否有解決方法?
MySQL 轉儲只有一個
where
子句,這使得在兩個表中使用起來很困難,就像你做的那樣。一種方法是在 t1 中,創建一個名為
id
有效的生成列user_id
。ALTER TABLE t1 ADD id UNSIGNED INT GENERATED ALWAYS AS (user_id), ADD INDEX id_key ( id)
調整類型以匹配
user_id
.參考:https ://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html
解決方案1:-
轉儲表數據使用
SELECT ... INTO OUTFILE
語句將選定的行寫入文件並使用LOAD DATA
語句恢復到表中。例如。
- 使用從 Backup Server 備份表
SELECT * INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM DB.T1 WHERE user_id>200;
- 使用在還原伺服器上創建相同的 T1 表
CREATE TABLE T1 (...)
- 將文件從備份伺服器複製到還原伺服器(
scp
在 Linux 上使用命令)- 使用恢復表中的數據
LOAD DATA INFILE '/tmp/result.txt' INTO TABLE DB.T1;
解決方案2: -
需要準備 shell 腳本,它將值傳遞
mysqldump
給每個表的命令中的 where 選項。