假设您有一个 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/