mysqldump - 将多个数据库从不同的 mysql 帐户转储到一个文件
Posted
技术标签:
【中文标题】mysqldump - 将多个数据库从不同的 mysql 帐户转储到一个文件【英文标题】:mysqldump - Dump multiple databases from separate mysql accounts to one file 【发布时间】:2013-05-04 15:33:03 【问题描述】:我使用的标准mysqldump命令是
mysqldump --opt --databases $dbname --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filename
转储多个数据库
mysqldump --opt --databases $dbname1 $dbname2 $dbname3 $dbname_etc --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filename
我的问题是如何将不同 MySQL 帐户中的多个数据库转储到一个文件中?
更新:当我的意思是 1 个文件时,我的意思是 1 个 gzip 压缩文件,其中包含不同站点的不同 sql 转储。
【问题讨论】:
【参考方案1】:对于每个 MySQL 服务器帐户,将数据库转储到单独的文件中
对于每个转储文件,执行以下命令:
cat dump_user1.sql dump_user2.sql | gzip > super_dump.gz
Superuser.com 网站上也有类似的帖子:https://superuser.com/questions/228878/how-can-i-concatenate-two-files-in-unix
【讨论】:
呃,我的错。我没有指定我想要的一个文件的结构。我更新了我的问题以澄清它。 为什么不转储不带压缩的数据库,然后将多个文件压缩在一起? 这可以只用一行来完成吗?基本上,我不想将文件转储到文件夹然后 gzip 它们。我希望它只输出完成的压缩文件。我不熟悉 unix,但它可能可以用管道完成? 我不太了解 UNIX,但我相信必须单独转储每个文件,然后在完成后压缩它们,这在将来可能会有点用处,例如某些崩溃.【参考方案2】:似乎没有人澄清这一点,所以我要给我的 2 美分。
在这里要注意,我的经验是在 BASH 中,并且可能是它独有的,因此变量和循环在您的环境中可能会有所不同。
实现包含单独文件的存档的最佳方法是使用 ZIP 或 TAR,由于其简单性和可用性,我更喜欢使用 tar。
Tar 本身不做压缩,但与 bzip2 或 gzip 捆绑在一起可以提供出色的结果。由于您的示例使用 gzip,我将在演示中使用它。
首先,让我们来解决 MySQL 转储的问题,mysqldump
命令不会分离文件(无论如何,据我所知)。因此,让我们做一个小变通方法,为每个数据库创建 1 个文件。
mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump -p$dbpass --user=$dbuser $db > $db.sql; done
所以现在我们有一个字符串,它将显示每个文件的数据库,并将这些数据库导出到您需要的地方,只需编辑 > 符号之后的部分
接下来,让我们来看看 TAR 的语法
tar -czf <output-file> <input-file-1> <input-file-2>
由于这种配置,它允许我们指定要归档的大量文件。
选项细分如下。
c - 压缩/创建存档
z - GZIP 压缩
f - 输出到文件
j - bzip 压缩
我们的下一个问题是保存所有新创建文件的列表,我们将扩展 while 语句以在运行 MySQL 中找到的每个数据库时附加到一个变量。
DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > $db.sql; DBLIST="$DBLIST $DB"; done
现在我们有了一个 DBLIST 变量,我们可以使用它来输出将要创建的所有文件,然后我们可以修改我们的 1 行语句以在处理完所有内容后运行 tar 命令。
DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > $db.sql; DBLIST="$DBLIST $DB"; done && tar -czf $filename "$DBLIST"
这是一种非常粗略的方法,不允许您手动指定数据库,因此要实现这一点,使用以下命令将为您创建一个包含所有指定数据库的 TAR 文件。
DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > $db.sql; DBLIST="$DBLIST $DB.sql"; done && tar -czf $filename "$DBLIST"
MySQL 数据库中的 MySQL 数据库循环来自以下 ***.com 问题“mysqldump with db in a separate file”,该问题经过简单修改以满足您的需求。
要让脚本在 1 行中自动清理它,只需在命令末尾添加以下内容
&& rm "$DBLIST"
使命令看起来像这样
DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > $db.sql; DBLIST="$DBLIST $DB.sql"; done && tar -czf $filename "$DBLIST" && rm "$DBLIST"
【讨论】:
只是一个小信息。您可以使用where
语句过滤数据库。我用它从导出中删除了 mysql、information_schema 和 performance_schema 数据库。 SQL命令如下:show databases where `Database` <> "mysql" and `Database` <> "information_schema" and `Database` <> "performance_schema";
【参考方案3】:
以防万一“多个 db”对您来说是“所有 db”
mysqldump -u root -p --all-databases > all.sql
【讨论】:
以上是关于mysqldump - 将多个数据库从不同的 mysql 帐户转储到一个文件的主要内容,如果未能解决你的问题,请参考以下文章
Cron mysqldump,无法读取“/etc/my.cnf.d”的目录(错误代码:2)