mysql - 如何使用 Ansible 创建大型数据库

标签 mysql linux ansible

假设您有一个 sql 文件 database.sql,它创建数据库模式、其中的表和一些初始填充。通常,我可以使用 ansible 通过以下方式制作此数据库:

---

- name: copy database.sql to server
  template: src=database.sql dest=/tmp/database.sql owner=root group=root

- name: sql the thing into MySQL
  command: mysql "-u root -p{{ mysql_root_password }} < /tmp/database.sql"

- name: remove the sql file from the server
  command: rm -f /tmp/database.sql

这完全符合它所说的。但是当 database.sql 很大(可能是 2 TB)时,您真的不希望首先执行复制操作。有没有办法将 database.sql 称为 ansible-master 服务器(我们从那里推送它)上的文件,这样你就可以执行 mysql -u root@master -p... < "local file"这样不再需要复制操作?

最佳答案

无论您做什么,数据都必须从它所在的位置流向数据库服务器。请注意,在您的示例中,您应该使用 copy 而不是 template :Jinja 正在解析模板,解析大文件的成本非常高。

话虽如此,您可能想使用 local_action 并远程提供您的 mysql 服务器:

- name: feed database.sql to server
  local_action: shell mysql -u root -p{{ mysql_root_password }} -h {{ ansible_default_ipv4 }} < /tmp/database.sql

这将在本地运行命令,并且在以下情况下应该有效:

  • 您的数据库转储位于本地计算机上的 /tmp/database.sql
  • /tmp/database.sql 包含数据库创建语句
  • 您可以远程连接到您的 mysql 服务器(提示:检查权限 + bind_address)

为了让事情更简洁一些,你可以使用 mysql_db 模块:

- name: feed database.sql to server
  local_action: mysql_db login_user=root login_password={{ mysql_root_password }} login_host={{ ansible_default_ipv4 }} name={{ db_name }} state=import target=/tmp/database.sql

关于mysql - 如何使用 Ansible 创建大型数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21908582/

相关文章:

php - 什么时候应该使用 mysqli_kill() 和 mysqli_close()?

mysql - 如何加入这些表?是否可以?

安塞 bool 2.6 : Is there a way to reference the playbook's name in a role task?

postgresql - Ansible "postgresql_user"模块 "priv"参数语法清晰

mysql - 我已经有一个带有 EC2 的 RDS (Mysql) 数据库,我是否需要为 Elastic Beanstalk 创建一个新数据库?

php - 条件 PDO bindParam 更新

linux - 无法在 Linux 中安装 Expect 实用程序

linux - 在加载 perl 模块之前修改 ld.so 路径

linux - sendfile()/TransmitFile() 带加密/解密

amazon-ec2 - 检索 ec2 list 时出现身份验证错误。找到了 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 环境变量,但可能不正确