Вы можете запустить клиентскую команду 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"