使用mysqldump和数据库用户

时间:2010-10-20 21:05:33

标签: mysql mysqldump

我正在尝试汇集mysqldump所需的所有选项,以便将我的应用程序数据库使用的所有内容创建到单个脚本中。这包括数据库本身和所有数据库用户/密码/权限。

除了用户作品外,我已经弄明白了......这就是我目前正在使用的内容:

mysqldump -h host -u root -p \
    --add-drop-database --routines -B database_name > backup.sql

那么,我错过了什么?

7 个答案:

答案 0 :(得分:43)

数据库用户/密码/权限保存在mysql数据库中,不会被dump命令转储。您还必须将该数据库添加到要转储的DB列表中:

mysqldump ... --routines --databases database_name mysql > backup.sql

或只是转储所有内容:

mysqldump ... --routines --all-databases > backup.sql

答案 1 :(得分:23)

转储mysql数据库时,不要忘记:

 --flush-privileges  Emit a FLUSH PRIVILEGES statement after dumping the mysql
                     database.  This option should be used any time the dump
                     contains the mysql database and any other database that
                     depends on the data in the mysql database for proper
                     restore.

答案 2 :(得分:10)

所以,我有一个根本的误解。用户不是特定于数据库,而是在服务器级别创建。

您可以使用以下查询查看所有现有用户:

SELECT * FROM mysql.user;

知道了这一点,很明显mysqldump不应该对用户做任何事情。但是,如果您需要导出/导入用户和权限的答案,我建议您查看以下文章 - 它帮助了我。

http://pento.net/2009/03/12/backing-up-permissions-for-individual-databases/

我为董事会上的噪音道歉,但我想我会离开这个帖子,因为其他人也有同样的误解。

答案 3 :(得分:1)

从一个Mac OS X开发环境迁移到新环境时,对我来说是完整的过程。

0)在新的MacBook上摆脱MySQL的较新版本

我不小心安装了MySQL 8,因此必须删除它,因为它比我的旧MacBook更新。

rspec -t ~qa

1)在新的MacBook上安装相同版本的MySQL

# Remove binaries
$ brew uninstall mysql

# Remove data/config that is leftover
$ rm -r /usr/local/var/mysql/

2)将数据转储到旧MacBook

# Install version that matched old MacBook
$ brew install mysql@5.7

# Because it is an old version, you have to do a special configuration step
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

# Start server
$ mysql.server start

3)在新的MacBook上还原数据

$ mysqldump -uroot --flush-privileges --routines --all-databases > complete_dump.sql

答案 4 :(得分:0)

你可能想看看mysqlpump,它可以转储所有数据库,并且可以将用户导出为 CREATE USER 和 GRANT 语句,而不是依赖于 mysql 系统 db + mysql_upgrade。

mysqlpump # Dumps (almost) all databases (see [2])
mysqlpump --exclude-databases=% --users # Dumps all user accounts

文档中不清楚您是否可以执行 mysqlpump --users 并获取所有数据库和用户。

默认情况下会省略某些系统表,请参阅 restrictions

答案 5 :(得分:0)

连接到您的数据库服务器并执行:

select concat('show grants for ','\'',user,'\'@\'',host,'\'') from mysql.user;

你会得到这样的东西:

+--------------------------------------------------------+
| concat('show grants for ','\'',user,'\'@\'',host,'\'') |
+--------------------------------------------------------+
| show grants for 'mariadb.sys'@'localhost'              |
| show grants for 'mysql'@'localhost'                    |
| show grants for 'root'@'localhost'                     |
+--------------------------------------------------------+

将输出捕获到某个临时文件中。

然后循环遍历该临时文件中的每一行,将其发送到您的 mysql 服务器,捕获输出。

输出将是您可以用来在另一台服务器上重建用户的东西:

GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket WITH GRANT OPTION
GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION    

这是我目前使用的脚本:

mysql -u${BACKUP_DB_USER} -p${BACKUP_DB_PASSWORD} -e"select concat('show grants for ','\'',user,'\'@\'',host,'\'') from mysql.user" > user_list_with_header.txt
sed '1d' user_list_with_header.txt > ./user.txt
while read user; do  mysql -u${BACKUP_DB_USER} -p${BACKUP_DB_PASSWORD} -e"$user" > user_grant.txt; echo "-- ${user}" >> user_privileges.txt; sed '1d' user_grant.txt >> user_privileges.txt; done < user.txt
echo "flush privileges" >> user_privileges.txt;
awk '{print $0";"}'  user_privileges.txt > all_user_privileges_final.sql
rm user.txt user_list_with_header.txt user_grant.txt user_privileges.txt

您将在文件 all_user_privileges_final.sql 中拥有所有授权语句。

当然,您可以将初始查询限制为仅列出您想要的用户。

答案 6 :(得分:0)

mysqldump 10.19 版包含选项 --system=users,它将 CREATE USERGRANT 命令添加到转储中。

mysqldump -h host -u root -p \
    --add-drop-database --routines -B database_name \
    --system=users > backup.sql

来源:https://mariadb.com/kb/en/mysqldump/