我希望能够将 mysqdump 从远程服务器复制到本地机器。
我有一个脚本可以做到这一点,但我们的操作人员现在已经更改了服务器权限,它不起作用。
因此,在我能够从我的机器以 root 身份登录 SSH 并提供密码并连接到 mysql 之前,我在 Perl 脚本中有一个命令,如下所示:
sshpass -p root_password ssh root@$servername mysqldump $database_name > $mysqldump_location
无论如何,权限已经改变,我无法使用 root 从本地机器登录。
现在我需要
- 使用部署用户登录远程服务器。
- 登录后,我需要使用 su - 来获取 root 用户
- 现在我可以执行 mysqldump 命令(部署用户收到拒绝访问消息)
我想要一个可以从我的本地机器执行的脚本或命令,并让其执行以下步骤 - 以部署身份登录,切换到 root ,创建 mysql 转储并将其复制到我的本地机器。
最好的解决方法是什么?使用 SSH 隧道是否可行?或者脚本选项是否更好(如何编写多个登录脚本)?
答案1
你可能最好使用 ansible 来实现这一点: https://docs.ansible.com/ansible/2.5/modules/mysql_db_module.html
...它将负责 sudo 以及转储如何完成。
例如,mysqldump.yml 剧本包含:
- hosts: all
gather_facts: false
serial: 1
- name: Dump all databases to hostname.sql
mysql_db:
state: dump
name: all
target: /tmp/{{ inventory_hostname }}.sql
...然后定位你的 mysql 框,像这样 sudo'ing (-kK):
$ ansible-playbook -i ${servername}, mysqldump.yml -kK -v
SSH password: <your non-root password on target>
SUDO password[defaults to SSH password]: <usually hit return>
答案2
您不需要成为 Linux 操作系统上的 root 用户就可以以 root 身份运行 MySQL 命令,您只需从您的个人 Linux 帐户登录到 MySQL root 帐户,只需将 root 用户名和 root 密码添加到您的脚本中即可(并且可能更改您写入数据库转储的文件系统位置)。
甚至更好的是为 MySQL 备份创建一个专用用户,这样您就不需要过多的 DBA 权限来进行简单的备份。
CREATE USER 'backup'@'localhost' IDENTIFIED BY 's3cr3t-p@ssw0rd';
可以与 INNODB 表一起使用的 mysqldump --single-transaction 需要以下权限:
GRANT SELECT, SHOW VIEW, RELOAD, REPLICATION CLIENT, EVENT, TRIGGER ON *.* TO 'backup'@'localhost';
MyISAMB 表的 mysqldump --lock-all-tables 还需要 LOCK TABLES 角色:
GRANT LOCK TABLES ON *.* TO 'backup'@'localhost';
答案3
如果可以的话,您可以使用 RSA 密钥直接登录到 root 帐户。
要允许使用 RSA 密钥直接登录 root:
- 编辑文件/etc/sshd/sshd_config并设置允许无密码登录(如果您使用允许用户,也把根放在那里)
- 重新启动 SSH:服务 sshd 重启(可能是服务 ssh 重启,一次重启,视情况而定)
之后,生成你的 RSA 密钥(本地机器)并将其放入授权密钥(远程服务器):
- 在本地机器上,运行ssh-keygen然后系统会提示你把文件放在哪里、设置密码等;只需按回车键即可完成
- 复制内容id_rsa.pub里面/根/.ssh(或者 /home/你的用户/.ssh如果不是root)
- 转到远程服务器并苏生根
- 编辑文件/root/.ssh/authorized_keys(若不存在则创建)
- 将密钥粘贴到文件末尾并保存
- 返回您的机器并尝试直接登录root@remoteserver。