Exportando e importando um mysqldump de dentro de um documento do CLI do mysql

1

O código a seguir descarta um usuário do BD e uma instância do BD pelo nome de test , se ambos existirem, cria um usuário de banco de dados privilegiado, autorizado e uma instância de BD com o mesmo nome (também 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

Eu também não tenho as coisas neste código:

  1. Exportando ${domain} para um {$domain}.sql mysqldump.
  2. Importando ${domain}.sql mysqldump para o banco de dados test DB.

Como eu poderia adicionar essas duas ações, mas dentro do documento? Eu não quero que eles sejam ações diferentes fora do heredocument (o que requer inserir o nome de usuário e senha de novo e de novo), ao invés disso, eu preciso delas como consultas regulares do mysql dentro do documento, vindo logo após a última consulta GRANT.

    
por Arcticooling 06.12.2017 / 09:16

1 resposta

2

1. Exportando

Infelizmente, shell mysql pode ' Não despeje o conteúdo do banco de dados como o mysqldump , então é impossível executar consultas SQL e despejar banco de dados em uma chamada para mysql ou mysqldump . No entanto, você pode:

a) Conceda ao usuário test acesso ao banco de dados ${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

subseqüentemente ligue:

mysqldump -u test -p"${psw}" "${domain}" >domain.sql

e finalmente ligue:

mysql -u test -p"${psw}" <<-MYSQL
    REVOKE ALL PRIVILEGES ON ${domain}.* FROM 'test'@'localhost';
    REVOKE GRANT OPTION ON ${domain}.* FROM 'test'@'localhost';
MYSQL

Não é necessário inserir a senha novamente quando ela é passada na linha de comando. No entanto, passar a senha na linha de comando é inseguro, portanto, você pode considerar usar expect ou criação de my.cnf com configurações de usuário / senha e referir-se a ele com --defaults-extra-file= as motivast sugerido.

b) Você pode ler a senha de root no começo do seu script e usá-la nas chamadas subsequentes do mysql (isto é descrito em motivast comentário):

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) Se você só precisar despejar a estrutura da tabela e souber os nomes das tabelas, poderá usar o SHOW CREATE TABLE SQL:

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

Mas isso é muito exótico e domain.dump precisaria de um pouco de edição depois.

2. Importando

Isso é muito fácil com o comando source (o mesmo que no bash):

mysql -u root -p <<-MYSQL
    ...
    use test;
    source ${domain}.sql;
MYSQL
    
por 09.12.2017 / 03:04