Mysql
從 mysql CLI heredocument 中導出和導入 mysqldump
以下程式碼刪除一個名為 的數據庫使用者和一個數據庫實例
test
,如果兩者都存在,則創建一個授權的、所有特權的數據庫使用者和一個同名的數據庫實例(也是test
)。mysql -u root -p <<-MYSQL DROP user IF EXISTS 'test'@'localhost'; SELECT user FROM mysql.user; DROP database IF EXISTS test; show databases; CREATE user 'test'@'localhost' IDENTIFIED BY '${psw}'; CREATE database test; GRANT ALL PRIVILEGES ON test.* TO test@localhost; MYSQL
我在這段程式碼中缺少太多東西:
- 導出
${domain}
到{$domain}.sql
mysqldump。${domain}.sql
將mysqldump 導入DBtest
數據庫。我怎麼能在 heredocument 中添加這兩個動作?我不希望它們是 heredocument 之外的不同操作(需要一次又一次地輸入使用者名和密碼),而是我需要它們作為 heredocument 中的正常 mysql 查詢,緊接在最後一個 GRANT 查詢之後。
- 出口
不幸的是,mysql shell不能像mysqldump那樣轉儲數據庫內容,因此不可能在一次呼叫mysql或mysqldump時執行 SQL 查詢和轉儲數據庫。但是,您可以:
**a)**授予使用者
test
訪問${domain}
數據庫的權限:mysql -u root -p <<-MYSQL ... GRANT ALL PRIVILEGES ON ${domain}.* TO 'test'@'localhost'; GRANT GRANT OPTION ON ${domain}.* TO 'test'@'localhost'; FLUSH PRIVILEGES; MYSQL
隨後呼叫:
mysqldump -u test -p"${psw}" "${domain}" >domain.sql
最後呼叫:
mysql -u test -p"${psw}" <<-MYSQL REVOKE ALL PRIVILEGES ON ${domain}.* FROM 'test'@'localhost'; REVOKE GRANT OPTION ON ${domain}.* FROM 'test'@'localhost'; MYSQL
無需再次輸入密碼,因為它是在命令行中傳遞的。但是,在命令行中傳遞密碼是不安全的,因此您可以考慮使用
expect
或創建帶有使用者/密碼設置的 my.cnf,並--defaults-extra-file=
按照建議的動機引用它。**b)**您可以在腳本開頭讀取root密碼,然後在後續的mysql呼叫中使用它(這在motivast評論中描述):
read -s -p 'Enter password: ' root_psw echo my_cnf=`tempfile -s .cnf -m 400` echo "[mysql] >${my_cnf} echo "user=root" >>${my_cnf} echo "password=${root_psw}" >>${my_cnf} # Delete the password file after this script finish (even in case of error) cleanup_my_cnf { rm "${my_cnf}"; } trap cleanup_my_cnf INT TERM EXIT mysql --defaults-extra-file="${my_cnf}" <<-MYSQL ... MYSQL mysqldump --defaults-extra-file="${my_cnf}" "${domain}" >domain.sql
**c)**如果您只需要轉儲表結構並且您知道表名,則可以使用
SHOW CREATE TABLE
SQL:mysql -u root -p <<-MYSQL ... use ${domain}; tee domain.dump; SHOW CREATE TABLE table1; SHOW CREATE TABLE table2; MYSQL
但這太奇特了, domain.dump 之後需要進行一些編輯。
- 進口
使用 source 命令(與 bash 中的相同)非常容易:
mysql -u root -p <<-MYSQL ... use test; source ${domain}.sql; MYSQL