从 mysql CLI 中导出和导入 mysqldump 文档

从 mysql CLI 中导出和导入 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

我在这段代码中也缺少一些东西:

  1. 导出${domain}{$domain}.sqlmysqldump。
  2. ${domain}.sql将mysqldump导入到testDB 数据库中。

我怎样才能添加这两个动作但是里面这里的文档?我不希望它们在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

相关内容