【问题标题】:How to perform a mysqldump without a password prompt?如何在没有密码提示的情况下执行 mysqldump?
【发布时间】:2012-03-06 18:35:22
【问题描述】:

我想知道在不提示输入密码的情况下执行数据库 mysqldump 的命令。

原因: 我想运行一个 cron 作业,它每天需要一次数据库的 mysqldump。因此,我将无法在提示时输入密码。

我该如何解决这个问题?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以在命令行中指定密码,如下所示:

    mysqldump -h <host> -u <user> -p<password> dumpfile
    

    mysqldump 的选项区分大小写!

    【讨论】:

    • 不,它不起作用,我认为它不明白 -p 是密码
    • 不确定这是如何获得 1 票的,我对此表示反对。如此处的其他答案所示, -p 和给定密码之间不应有空格。此外,您应该将输出重定向到转储文件,而不是像您正在做的那样指定它,否则它会被假定为一个表名。 @buzypi 说得最好。
    • 它应该可以工作(虽然不安全,因为其他用户很容易看到密码)你只需要确保 -p 和密码之间没有空格,例如mysqldump -u root -pmypassword
    【解决方案2】:

    由于您使用的是 Ubuntu,您只需在您的主目录中添加一个文件,它将禁用 mysqldump 密码提示。这是通过创建文件~/.my.cnf 来完成的(权限需要为600)。

    将此添加到.my.cnf 文件中

    [mysqldump]
    user=mysqluser
    password=secret
    

    这使您可以作为需要密码的 MySQL 用户进行连接,而无需实际输入密码。您甚至不需要 -p 或 --password。

    非常方便编写 mysql 和 mysqldump 命令的脚本。

    可在this link 中找到实现此目的的步骤。

    或者,您可以使用以下命令:

    mysqldump -u [user name] -p[password] [database name] > [dump file]
    

    但请注意,它本质上是不安全的,因为在转储运行时,系统上的任何其他用户都可以通过简单的ps ax 命令查看整个命令(包括密码)。

    【讨论】:

    • 在命令行上通过 -p 否决了其他答案,因为任何用户都可以 ps aux 来查看 root 或用户的密码。使用上面的文件建议是最安全的
    • 如果全局设置不是一个选项(如果您不仅要连接一个 mysql 实例),您可以通过--defaults-file 设置配置文件。像`mysqldump --defaults-file=my_other.cnf --print-defaults`
    • @kante:它是安全的。它仅对 .my.cnf 文件所属的用户可用。
    • 在 Windows 上,配置文件不在~/.my.cnf。见stackoverflow.com/a/14653239/470749。 MySql 预计我的地址是c:\wamp\bin\mysql\mysql5.5.24\my.cnf。所以我在那里创建了一个文件。不需要重启 Mysql;它立即为我的下一个 mysqldump 工作。
    • 要增加安全级别,您应该使用专用的、非数据库特定的、只读用户,在任何情况下都不能使用 root 用户。可以这样做:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
    【解决方案3】:

    当然,我认为将完整的 cmd 行放在根 crontab 中会更好,更安全,并带有凭据。 至少 crontab 编辑被限制(可读)给已经知道密码的人......所以不用担心以纯文本形式显示它......

    如果需要的不仅仅是一个简单的 mysqldump...只需放置一个 bash 脚本,该脚本接受凭据作为参数并在其中执行所有便利...

    简单的bas文件

    #!/bin/bash
    mysqldump -u$1 -p$2 yourdbname > /your/path/save.sql
    

    在 Crontab 中:

    0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log
    

    【讨论】:

    • 不,这不会更安全,当您将密码添加到命令行时,任何能够读取 proc(或执行完整 ps)的人都可以看到它——这是非常默认的。当您添加 .my.cnf 文件并设置 600 权限时,它仅对您可见。
    【解决方案4】:

    添加到@Frankline 的答案:

    -p 选项必须从命令中排除才能在配置文件中使用密码。

    正确:
    mysqldump –u my_username my_db &gt; my_db.sql

    错误:
    mysqldump –u my_username -p my_db &gt; my_db.sql



    .my.cnf 可以省略用户名。

    [mysqldump]
    password=my_password
    

    如果您的.my.cnf 文件不在default location 中并且mysqldump 看不到它,请使用--defaults-file 指定它。

    mysqldump --defaults-file=/path-to-file/.my.cnf –u my_username my_db &gt; my_db.sql

    【讨论】:

    • 该死,很多 XAMPP 教程都包含 -p 而没有解释它。它不适用于绕过空白密码...
    【解决方案5】:

    是的,这很容易....只是在一个神奇的命令行没有更多

    mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql
    

    完成了:)

    【讨论】:

    • 警告:在命令行界面上使用密码可能不安全。
    • @Yottatron 这可能是不安全的,尤其是在古代 Unix 系统在一天的大部分时间里很容易有 10-15 人登录并且 vi 陷入困境的那一天。在现代 VPS 上,虽然您可以让 10-15 人进入并使用 IRC,但通常只有管理员才能拥有 shell 访问权限。
    • 谢谢你,我只是在 Docker devbox 中使用它。所以安全不是问题。
    【解决方案6】:

    要使用操作系统内部任何位置的文件,请使用--defaults-extra-file 例如:

    mysqldump --defaults-extra-file=/path/.sqlpwd [database] > [desiredoutput].sql
    

    注意:.sqlpwd 只是一个示例文件名。你可以使用任何你想要的东西。

    注意:MySQL 会自动检查~/.my.cnf 可以用来代替--defaults-extra-file

    如果你和我一样使用 CRON,试试这个!

    mysqldump --defaults-extra-file=/path/.sqlpwd [database] > "$(date '+%F').sql"
    

    所需的权限和推荐的所有权

    sudo chmod 600 /path/.sqlpwd && sudo chown $USER:nogroup /path/.sqlpwd
    

    .sqlpwd 内容:

    [mysqldump]
    user=username
    password=password
    

    传递.cnf.sqlpwd 的其他示例

    [mysql]
    user=username
    password=password
    
    [mysqldiff]
    user=username
    password=password
    
    [client]
    user=username
    password=password
    

    如果您想自动登录数据库,则需要 [mysql] 条目。

    您现在可以创建一个别名来自动将您连接到 DB

    alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"
    

    您也可以只将密码放在.sqlpwd 中,并通过脚本/cli 传递用户名。我不确定这是否会提高安全性,这将是一个完全不同的问题。

    为了完整起见,我将声明您可以执行以下操作,但是非常不安全,并且永远不应该在生产环境中使用:

    mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql
    

    注意:-p 和密码之间没有空格。

    例如-pPassWord 是正确的,而-p Password 是不正确的。

    【讨论】:

    • 这是最好的答案,尤其是在考虑多个数据库和用户/密码时。
    • 顺便说一句,长选项(例如 --defaults-file)应该放在短选项(例如 -u)之前。在 mysqldump 版本 5.7.17 上测试。
    • @Sysadmin 选项参数以一个破折号或两个破折号开头,具体取决于它是选项名称的短格式还是长格式。许多选项都有短格式和长格式。例如, -?和 --help 是指示 MySQL 程序显示其帮助消息的选项的短形式和长形式。 dev.mysql.com/doc/refman/8.0/en/command-line-options.html
    【解决方案7】:

    一些答案​​提到将密码放在配置文件中。

    或者,您可以从您的脚本中export MYSQL_PWD=yourverysecretpassword

    与使用配置文件相比,此方法的优势在于您不需要单独的配置文件来与脚本保持同步。您只需维护脚本。

    此方法没有缺点

    密码对系统上的其他用户可见(如果它在命令行上则可见)。环境变量只对运行 mysql 命令的用户和 root 可见。

    任何可以阅读脚本本身的人都可以看到密码,因此请确保脚本本身受到保护。这与保护配置文件没有任何不同。如果您想让脚本公开可读(例如export MYSQL_PWD=$(cat /root/mysql_password)),您仍然可以从单独的文件中获取密码。导出变量仍然比构建配置文件更容易。

    例如,

    $ export MYSQL_PWD=$(>&2 read -s -p "Input password (will not echo): "; echo "$REPLY")
    $ mysqldump -u root mysql | head
    -- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
    --
    -- Host: localhost    Database: mysql
    -- ------------------------------------------------------
    -- Server version   5.6.23
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    

    玛丽亚数据库

    MariaDBdocuments the use of MYSQL_PWD as:

    连接mysqld时的默认密码。强烈建议使用更安全的方法将密码发送到服务器。

    该页面没有提及“更安全”的方法可能是什么。

    MySQL

    MySQL 的最新文档版本仍然支持此方法:https://dev.mysql.com/doc/refman/8.0/en/environment-variables.html,尽管它带有以下警告:

    使用MYSQL_PWD 指定MySQL 密码必须被视为极度不安全,不应使用。某些版本的 ps 包含一个选项来显示正在运行的进程的环境。在某些系统上,如果您设置了MYSQL_PWD,您的密码就会暴露给运行 ps 的任何其他用户。即使在没有这种 ps 版本的系统上,假设没有其他方法可供用户检查进程环境也是不明智的。

    https://security.stackexchange.com/a/14009/10002 详细介绍了环境变量的安全性,此答案还解决了 cmets 中提到的问题。 TL;DR 十多年来无关紧要。

    话虽如此,MySQL 文档也警告说:

    MYSQL_PWD 自 MySQL 8.0 起已弃用;预计它会在 MySQL 的未来版本中被删除。

    我将在下面留下maxschlepzig 的评论:

    有趣的是,虽然 Oracle 不反对在命令行上传递密码,但实际上 非常不安全

    【讨论】:

    • @MatheusOl:环境变量只对 root 和用户本身可见——这些用户无论如何都可以访问持有密码的配置文件。
    • oneliner 怎么样:MYSQL_PWD=xoF3mafn5Batxasdfuo mysqldump -u root mysql 不需要 export。那应该可以解决问题吗?
    • @mniess 你错了。 export MYSQL_PWD=... 确实显示在进程列表中。哪怕是一瞬间。这是因为export 命令是(并且必须是)内置的shell。因此,如果您在 shell 中执行它,shell 不会使用命令的参数分叉/执行进程。
    • @maxschlepzig 你是对的。在这种情况下,这无关紧要,因为将密码放在 ENV 中会使其对其他用户可见(正如 mysql 文档中所警告的那样)
    • @mniess 正如我所说的,mysql 文档非常糟糕且具有误导性。在使用 Linux 和其他系统时,“必须被认为非常不安全并且不应该使用”是完全错误和糟糕的建议。这不支持您的主张,即:“因为将密码放入 ENV 使其无论如何都对其他用户可见”。旁注:有趣的是,虽然 Oracle 不反对在命令行上传递密码,但实际上 非常不安全。
    【解决方案8】:

    对我来说,使用 MariaDB 我必须这样做:添加文件 ~/.my.cnf 并通过执行 chmod 600 ~/.my.cnf 更改权限。然后将您的凭据添加到文件中。我缺少的神奇之处在于密码需要在客户端块下(参考:docs),如下所示:

    [client]
    password = "my_password"
    
    [mysqldump]
    user = root
    host = localhost
    

    如果您碰巧来到这里寻找如何使用 MariaDB 进行 mysqldump。将密码放在 [client] 块下,然后将用户放在 [mysqldump] 块下。

    【讨论】:

    • 我也在使用 MariaDB(具体来说是 10.4),我只需将密码放在 [mysqldump] 部分下,它就可以正常工作。 Ubuntu 18.04 LTS
    【解决方案9】:

    我有以下。

    /etc/mysqlpwd

    [mysql]
    user=root
    password=password
    

    使用以下别名。

    alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'
    

    要进行恢复,我只需使用:

    mysql -p [database] [file.sql]
    

    【讨论】:

    • 为什么不使用默认文件名 /etc/my.cnf 或 $HOME/.my.cnf?
    【解决方案10】:

    --password="" 怎么样 在 5.1.51 上为我工作

    mysqldump -h localhost -u <user> --password="<password>"
    

    【讨论】:

    • 在命令行中包含 --password=xxx 将使密码对任何能够读取 proc(或执行完整 ps)的人可见 - 这是非常默认的。跨度>
    【解决方案11】:

    这是 Docker 在脚本 /bin/sh 中的解决方案:

    docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]" > /root/mysql-credentials.cnf'
    
    docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user=root" >> /root/mysql-credentials.cnf'
    
    docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password=$MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'
    
    docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file=/root/mysql-credentials.cnf --all-databases'
    

    替换 [MYSQL_CONTAINER_NAME] 并确保在您的容器中设置了环境变量 MYSQL_ROOT_PASSWORD

    希望它能帮助你,就像它可以帮助我一样!

    【讨论】:

      【解决方案12】:

      检查您的密码!

      • 我花了一段时间才注意到我在 ~/.my.cnf 中使用的用户名和密码不正确

      • 在向 crontab 备份条目添加额外选项之前检查用户/密码基础知识

      • 如果在 mysqldump 中指定 --defaults-extra-file,那么这必须是第一个选项

      • 一个 cron 作业在主文件夹中使用 .my.cnf 可以正常工作,因此无需指定 --defaults-extra-file

      • 如果使用 mysqlpump(不是 mysqldump)相应地修改.my.cnf

      • ~/.my.cnf 需要设置权限,因此只有所有者具有读/写访问权限:

        chmod 600 ~/.my.cnf

      这是一个例子.my.cnf

      [mysql]
      host = localhost
      port = 3306
      user = BACKUP_USER
      password = CORRECTBATTERYHORSESTAPLE
      [mysqldump]
      host = localhost
      port = 3306
      user = BACKUP_USER
      password = CORRECTBATTERYHORSESTAPLE
      [mysqlpump]
      host = localhost
      port = 3306
      user = BACKUP_USER
      password = CORRECTBATTERYHORSESTAPLE
      
      • 本地主机不需要主机和端口条目

      • 如果您在 linux 中的用户名与用于备份的用户名相同,则不需要 user

      另一个提示,当您为 mysqldump 执行 cronjob 条目时,您可以使用 ionice -c 3 nice 19 将其设置为低优先级任务。结合 InnoDB 的 --single-transaction 选项,您可以运行不会锁定表或锁定其他地方可能需要的资源的备份。

      【讨论】:

        【解决方案13】:

        您可以通过 4 个简单的步骤实现这一目标

        1. 创建目录来存储脚本和 DB_backups
        2. 创建 ~/.my.cnf
        3. 创建一个 ~/.script.sh shell 脚本来运行 mysqldump
        4. 添加一个 cronjob 来运行 mysql 转储。

        以下是详细步骤

        第一步

        使用sudo mkdir ~/backup在您的主目录上创建一个目录

        第 2 步

        在您的主目录中运行 sudo nano ~/.my.cnf 并添加下面的文本并保存

        [mysqldump]
        #use this if your password has special characters (!@#$%^&..etc) in it
         password="YourPasswordWithSpecialCharactersInIt"
          
         #use this if it has no special characters
         password=myPassword
        

        第 2 步

        cd~/backup 并创建另一个文件 script.sh 将以下文本添加到其中

        SQLFILE=/path/to/where/you/want/to/dump/dbname.sql
        DATABASE=dbname
        USER=myUsername
        

        mysqldump --defaults-file=~/.my.cnf -u ${USER} ${DATABASE}|gzip > dbName_$(date +\%Y\%m\%d_\%H\%M).sql.gz

        第 3 步

        在您的控制台中,输入 crontab -e 打开将执行自动备份作业的 cron 文件

        将下面的文本添加到文件的底部

        0 0 * * * ./backup/script.sh
        

        添加到 cron 文件底部的文本假定您的备份应在每天午夜运行。

        这就是你所需要的一切 ;)

        【讨论】:

          猜你喜欢
          • 2022-01-09
          • 2016-12-01
          • 2023-02-04
          • 1970-01-01
          • 2013-10-15
          • 2017-08-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多