Mysql

從 mysql CLI heredocument 中導出和導入 mysqldump

  • December 9, 2017

以下程式碼刪除一個名為 的數據庫使用者和一個數據庫實例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

我在這段程式碼中缺少太多東西:

  1. 導出${domain}{$domain}.sqlmysqldump。
  2. ${domain}.sql將mysqldump 導入DBtest數據庫。

我怎麼能在 heredocument 中添加這兩個動作?我不希望它們是 heredocument 之外的不同操作(需要一次又一次地輸入使用者名和密碼),而是我需要它們作為 heredocument 中的正常 mysql 查詢,緊接在最後一個 GRANT 查詢之後。

  1. 出口

不幸的是,mysql shell不能像mysqldump那樣轉儲數據庫內容,因此不可能在一次呼叫mysqlmysqldump時執行 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 TABLESQL:

mysql -u root -p <<-MYSQL
   ...
   use ${domain};
   tee domain.dump;
   SHOW CREATE TABLE table1;
   SHOW CREATE TABLE table2;
MYSQL

但這太奇特了, domain.dump 之後需要進行一些編輯。

  1. 進口

使用 source 命令(與 bash 中的相同)非常容易:

mysql -u root -p <<-MYSQL
   ...
   use test;
   source ${domain}.sql;
MYSQL

引用自:https://unix.stackexchange.com/questions/409124