我正在运行 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 身份验证路线更安全。