以下代码删除名为 的数据库用户和数据库实例(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导入到test
DB 数据库中。
我怎样才能添加这两个动作但是里面这里的文档?我不希望它们在heredocument之外执行不同的操作(需要一次又一次输入用户名和密码),相反,我需要它们作为heredocument内的常规mysql查询,紧随最后一个GRANT查询之后。
答案1
1. 出口
很遗憾,mysql shell无法转储数据库内容,例如mysql转储确实如此,因此不可能在一次调用中执行 SQL 查询并转储数据库mysql或者mysql转储。但是您可以:
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=
as引用它动机建议。
b)您可以在脚本开头读取 root 密码,然后在后续 mysql 调用中使用它(这在动机评论):
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)如果您只需要转储表结构并且知道表名,则可以使用 SQL SHOW CREATE TABLE
:
mysql -u root -p <<-MYSQL
...
use ${domain};
tee domain.dump;
SHOW CREATE TABLE table1;
SHOW CREATE TABLE table2;
MYSQL
但这太奇特了,domain.dump 之后需要进行一些编辑。
2. 导入
使用 source 命令非常容易(与 bash 中相同):
mysql -u root -p <<-MYSQL
...
use test;
source ${domain}.sql;
MYSQL