我试图编写一个脚本,将我应用程序所使用的数据库的所有需要的mysqldump选项整合到一个脚本中。这包括数据库本身和所有数据库用户/密码/权限。
除了用户部分外,我已经全部搞定了...下面是我目前正在使用的内容:
mysqldump -h host -u root -p \
--add-drop-database --routines -B database_name > backup.sql
那么,我错过了什么?
我试图编写一个脚本,将我应用程序所使用的数据库的所有需要的mysqldump选项整合到一个脚本中。这包括数据库本身和所有数据库用户/密码/权限。
除了用户部分外,我已经全部搞定了...下面是我目前正在使用的内容:
mysqldump -h host -u root -p \
--add-drop-database --routines -B database_name > backup.sql
那么,我错过了什么?
数据库用户/密码/权限保存在 mysql
数据库中,不会随着您的转储命令而被转储。您需要将该数据库添加到要转储的数据库列表中:
mysqldump ... --routines --databases database_name mysql > backup.sql
或者仅仅倾倒所有内容:
mysqldump ... --routines --all-databases > backup.sql
在转储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.
所以,我有一个根本性的误解。用户并不是特定于数据库,而是在服务器级别创建。
您可以使用以下查询查看所有现有用户:
SELECT * FROM mysql.user;
由此可见,mysqldump不应该处理用户。但是,如果您需要导出/导入用户和权限的答案,建议您查看以下文章——它对我很有帮助。
http://pento.net/2009/03/12/backing-up-permissions-for-individual-databases/
对于在论坛上发表的冗余帖子,我表示歉意,但我认为我应该保留这篇文章,以防其他人产生同样的误解。
当我从一个Mac OS X开发环境迁移到另一个新的开发环境时,整个流程如下:
我不小心安装了MySQL 8,因此必须将其删除,因为它比我旧的MacBook上的版本更高。
# Remove binaries
$ brew uninstall mysql
# Remove data/config that is leftover
$ rm -r /usr/local/var/mysql/
# 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
$ mysqldump -uroot --flush-privileges --routines --all-databases > complete_dump.sql
$ mysql -p -uroot < complete_dump.sql
mysqldump版本10.19包含选项--system=users
,它将CREATE USER与GRANT命令添加到转储中。
mysqldump -h host -u root -p \
--add-drop-database --routines -B database_name \
--system=users > backup.sql
mysqldump
版本,而不是MySQL的。 - bfontaine连接到您的数据库服务器并执行:
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
中找到所有授权语句。
当然,您可以限制初始查询,仅列出您想要的用户。
如果 mysql client is for MariaDB,那么你只能使用选项--system=users
从mysql/MariaDB
中获取用户dump。
例如:
检查 mysql --version
。如果输出类似于 mysql Ver 15.1 Distrib 10.6.8-MariaDB
那么就是
mysqldump -h <hostname> -u <usename> -p --system=users > mysqldb_users.sql
database_name
中。 - ceejayoz