Экспорт представлений из Mysql с помощью команды Docker - PullRequest
0 голосов
/ 13 октября 2018

Код ниже извлекает представления отдельно от базы данных.Тем не менее, я пытаюсь заставить это работать в одной команде запуска или команды exec.

Прямо сейчас, когда я пытаюсь, команда pipe и в сочетании с попыткой экранировать кавычки выдает мне ошибки.

mysql -u username INFORMATION_SCHEMA
--skip-column-names --batch
-e "select table_name from tables where table_type = 'VIEW'
  and table_schema = 'database'"
| xargs mysqldump -u username database
> views.sql

Кто-нибудь знает, как этого добиться в одной команде docker?

Например:

docker exec -i $(docker-compose ps -q mysqldb) mysql ...

Большая любовь.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вы можете запустить клиентскую команду mysql и инструмент mysqldump из того места, которое не находится "на сервере базы данных".В вашем случае вы можете запустить их с хоста, на котором установлен сервер MySQL, при условии, что вы запустили базу данных с параметрами, такими как docker run -p 3306:3306.Это выглядело бы примерно так:

mysql -h 127.0.0.1 -u username INFORMATION_SCHEMA \
  --skip-column-names --batch \
  -e "select table_name from tables where table_type = 'VIEW' and table_schema = 'database'" \
| xargs mysqldump -h 127.0.0.1 -u username database \
> views.sql

Это позволяет избежать всех проблем с цитированием оболочки при попытке передать это в docker exec, а также устраняет необходимость в доступе на уровне root на хосте для выполнения административной задачи.(если вы вообще можете запустить любую команду Docker, то можете использовать docker run, чтобы добавить себя к /etc/sudoers хоста, среди прочего).

Я также согласен с ответом @ MichaelBoesl: этодостаточно долго, чтобы попытка превратить его в однострочник не стоила того, что принесут различные цитаты и экранирование.Я, вероятно, записал бы это в скрипт и поместил бы SQL-запрос в файл.

#!/bin/sh
: ${MYSQL_HOST:=127.0.0.1}
: ${MYSQL_USER:=username}
: ${MYSQL_DATABASE:=INFORMATION_SCHEMA}
cat >/tmp/dump_views.sql <<SQL
SELECT table_name
FROM tables
WHERE table_type='VIEW' AND table_schema='database';
SQL
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" --skip-column-names --batch \
    "$MYSQL_DATABASE" </tmp/dump_views.sql \
  | xargs mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" "$MYSQL_DATABASE"
0 голосов
/ 13 октября 2018

Вы можете поместить все свои команды в скрипт bash на контейнере и просто выполнить скрипт!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...