【问题标题】:Using mysqldump and database users使用 mysqldump 和数据库用户
【发布时间】:2011-04-28 07:02:13
【问题描述】:

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

除了用户部分之外,我已经弄清楚了...这是我目前正在使用的:

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

那么,我错过了什么?

【问题讨论】:

标签: mysql mysqldump


【解决方案1】:

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

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

或者只是转储所有内容:

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

【讨论】:

  • 完美——这就是我刚刚发现的。我建议我们只是警告人们转储/恢复 mysql 数据库与使用我链接到的脚本可能会产生一些意想不到的影响,尤其是。如果两台服务器不是彼此的镜像(它们没有相同的数据库)。
  • 请记住,mysql 数据库中包含有关您可能不会转储的数据库的信息。我不知道当您将该元数据导入新的数据库服务器时会发生什么。
  • 我实际上想要相反的结果。我想要转储所有“标准”数据库,但不是用户信息等。所以我使用了一个明确的数据库列表,而不是所有数据库以避免转储“mysql”数据库。
【解决方案2】:

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

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

SELECT * FROM mysql.user;

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

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

我为黑板上的噪音道歉,但我想我会离开这个帖子,以防其他人有同样的误解。

【讨论】:

  • 不,这只是要做的事情。此外,如果这篇文章实际上让你解决了它,那么你应该将这个答案标记为“答案”而不是另一个。只是想我会分享。
  • 仅供参考,引用的链接显示了一条 SQL 语句,它给出了类似“UNION 和 INTO 的错误使用”之类的错误,解决方案是将 INTO 移动到最后一个 SELECT 语句
  • 是的,这就是答案。它回答了,你需要稍微动动脑筋,而不仅仅是复制一些人的命令
【解决方案3】:

dump 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.

【讨论】:

    【解决方案4】:

    从一个 Mac OS X 开发环境迁移到新环境时的完整过程。

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

    我不小心安装了 MySQL 8,所以我不得不删除它,因为它比我的旧 MacBook 更新。

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

    1) 在新 MacBook 上安装相同版本的 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
    

    2) 在旧 MacBook 上转储数据

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

    3) 在新 MacBook 上恢复数据

    $ mysql -p -uroot < complete_dump.sql
    

    【讨论】:

      【解决方案5】:

      你可能想看看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

      【讨论】:

        【解决方案6】:

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

        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 中拥有所有授权声明。

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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-06
            • 1970-01-01
            • 2014-12-03
            • 2013-08-12
            • 2020-10-16
            • 2011-05-25
            相关资源
            最近更新 更多