当在 bash 脚本中使用 unix 套接字进行 sql 访问时,如何以 mysql root 身份备份 mysql/mariadb 数据库?

当在 bash 脚本中使用 unix 套接字进行 sql 访问时,如何以 mysql root 身份备份 mysql/mariadb 数据库?

我正在运行 Ubunutu Server 20.04。我已使用 unix 套接字进行身份验证来保护 mariadb,这意味着我需要进入sudo mysql才能以 root 身份访问 mysql。

1) 如果我输入

mysql -u root -pMYROOTPASSWORD

以 root 用户身份访问 mysql,出现以下错误:

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

我正在尝试使用 mysql root 用户运行备份 mysql 数据库的命令。我想要使用的语法是...

mysqldump -u root -p MyDb > MyDb.sql

2) 如果我(作为我的家庭用户)输入

mysqldump -u root -p MyDb > MyDb.sql

我收到Enter password:提示,然后我必须输入我的 unix 密码,结果返回以下错误:

mysqldump: Got error: 1698: "Access denied for user 'root'@'localhost'" when trying to connect

3) 如果我输入

sudo mysqldump -u root -p MyDb > MyDb.sql

我再次收到Enter password:提示,这次我输入了一个错误的 UNIX 密码。这实际上仍然MyDb.sql会在我当前的目录中创建一个名为的文件。如何使用错误的 unix 密码备份数据库?为什么在为 sql root 备份输入错误的 sudo 密码时不会出现错误?这个数据库是如何备份的,以及在这个备份命令中使用错误的 sudo 密码会有什么后果?

4) 如果我输入

sudo mysqldump -u root -p MyDb > MyDb.sql

我得到了Enter password:提示,这次我输入了一个有效的 UNIX SUDO 密码。这再次成功在我的当前目录中创建了一个名为 MyDb.sql 的文件。但是,我不知道这个文件是否是有效的 sql-root-user DB 备份文件,因为 mysqldump 似乎会使用任何密码创建备份。

5) 问题在于#3#4,没有办法知道命令的根密码

sudo mysqldump -u root -p MyDb > MyDb.sql

实际上需要并且它是否有效。它是否需要我的 unix sudo 密码、我的 mysql root 密码(我认为该密码已被禁用或无效,因为我对 mysql root 使用 unix 套接字身份验证)或任何随机密码?

6) 这之所以如此重要,是因为我打算用这个命令创建一个备份脚本,然后在 crontab 中运行该脚本来自动备份。话虽如此,由于 sqlbackup 不会显示密码是否有效,所以我不知道应该在备份脚本中输入正确的密码。这让我想到了我的问题。

问题1: 我应该使用哪个密码来使用 mysql 根用户创建 mysql 数据库的 bash 备份脚本?

问题2:mysqldump --help命令指示密码选项为

 -p, --password[=name]
                      Password to use when connecting to server. If password is
                      not given it's solicited on the tty.

这是否意味着我的备份脚本语法应该如下所示?:

sudo mysqldump -u root -p'My_Unix_Sudo_Password' MyDb > MyDb.sql

这?:

sudo mysqldump -u root -p'MySql_Possibly_Disabled_or_Invalid_Root_Password' MyDb > MyDb.sql

或这个?:

sudo mysqldump -u root -p'It_Doesnt_Matter_the_Password_They_are_all_valid_somehow' MyDb > MyDb.sql

问题3: 我应该以root crontab用户身份还是以regular crontab用户身份运行备份脚本?

问题4 有没有一种简单的方法来验证和检查备份 SQL 数据库是否有效,而无需完全恢复和测试它?

问题5 如果我将 sql 备份命令放入 bash 备份脚本的语法不正确,那么创建以 root mysql 用户身份备份数据库的 sql 备份脚本的正确语法(包括自动备份的密码)是什么,并且在自动运行脚本的命令中排除密码提示?

谢谢你的帮助!

答案1

您似乎正在尝试针对同一个问题提出多种解决方案。

什么时候SO_PEERCRED 认证到位后,密码几乎无关紧要。当 MySQL 不使用 SO_PEERCRED 时,它将使用自己的内部密码存储(除非您明确配置它执行其他操作)。SO_PEERCRED 身份验证只能用于通过文件系统套接字的连接。当未明确指定主机或使用文字字符串“localhost”时,MySQL 客户端将使用文件系统套接字。

使用 SO_PEERCRED,MySQL 期望它配置的用户与连接的 OS 用户同名。默认情况下,MySQL 上的默认配置是仅允许 root OS 用户通过 SO_PEERCRED 进行连接。这是由 mysql.users 表中的“root@localhost”用户实现的。

您可以使用多种不同的组合来实现您的目标。但最好将您的 root 帐户保留用于以下任务:仅有的由 root 执行。而备份数据库不属于其中之一。因此我建议创建一个MySQL 中具有适当权限的新用户

如果您创建具有相同名称的 OS 用户,您将能够使用该帐户使用 SO_PEERCRED 机制在本地运行 mysqlbackup。

或者,您可以为 MySQL 帐户设置密码,如果您通过网络套接字而不是文件系统套接字进行连接,则需要提供密码才能连接。虽然 MySQL 客户端将“localhost”解释为使用文件系统套接字,但“127.0.0.1”将连接到网络端口(通常为 3306)。

为了安全起见,最好不要将密码以明文形式留在文件系统上,因此 SO_PEERCRED 身份验证路线更安全。

相关内容