簡體   English   中英

使用Ruby / Chef Recipe for Vagrant導入Mysql數據庫

[英]Importing Mysql database using Ruby/Chef Recipe for Vagrant

我正在編寫一個自動設置開發環境的廚師腳本。 我可以創建一個數據庫並授予權限,但我試圖找到一種方法將mysql轉儲文件導入剛剛創建的數據庫中。

我授予訪問權限的代碼是

ruby_block "Execute grants" do
  block do

    require 'rubygems'
    Gem.clear_paths
    require 'mysql'

    m = Mysql.new('localhost', "root", node[:mysql][:server_root_password])
    m.query("GRANT ALL ON *.* TO 'root'@'10.0.0.1' IDENTIFIED BY '#{node[:mysql][:server_root_password]}'")
    m.query('FLUSH PRIVILEGES')
end
end

我希望我能夠執行以下查詢#m.query("-u root -p root db_name < /project/db/import.sql")

但只是給了我一個錯誤。

我沒有做太多的Ruby,所以很難弄明白。 誰知道我怎么能這樣做?

如果它是文件路徑錯誤,並且您正在使用chef solo,請嘗試使用solo.rb中指定的路徑,如:

/tmp/chef-solo/site-cookbooks/path_to_file.sql

作為一般說明,考慮使用數據庫cookbook進行mysql用戶和數據庫管理任務。 一旦設置了必要的cookbook依賴項,就可以將這樣的代碼放入主配方的default.rb中

# externalize conection info in a ruby hash
mysql_connection_info = {
  :host => "localhost",
  :username => 'root',
  :password => node['mysql']['server_root_password']
}

# drop if exists, then create a mysql database named DB_NAME
mysql_database 'DB_NAME' do
  connection mysql_connection_info
  action [:drop, :create]
end

# query a database from a sql script on disk
mysql_database "DB_NAME" do
  connection mysql_connection_info
  sql { ::File.open("/tmp/chef-solo/site-cookbooks/main/path/to/sql_script.sql").read }
  action :query
end

#or import from a dump file
mysql_database "DB_NAME" do
  connection mysql_connection_info
  sql "source /tmp/chef-solo/site-cookbooks/main/path/to/sql_dump.sql;"
end

沒有測試過最后一個,因為在chef目錄中存儲數據庫文件確實減慢了速度。

另請參閱:將SQL文件導入mysql

您可以從MySQL命令行客戶端創建備份,但不能從SQL查詢中創建備份。 您需要從shell執行命令。 我相信execute資源可能會為您解決問題:

http://wiki.opscode.com/display/chef/Resources#Resources-Execute

我不是一個真正的Ruby人,但我設法讓Chef通過利用mysql命令行工具導入一個大的.sql文件。 我需要解決的挑戰:

  • 導入100 MB范圍內的.sql文件(如果需要GB或TB,則為YMMV)
  • 冪等 - 僅在.sql文件發生更改時才運行導入
  • 不將憑據作為命令參數傳遞給MySQL(安全問題)

首先,我創建了一個.my.cnf文件模板來傳遞憑據:

模板/默認/ .my.cnf.erb

[client]
host=<%= @host %>
user=<%= @user %>
password="<%= @password %>"

然后我在我的配方中添加了一個資源來填充模板:

食譜/進口db.rb

template '/root/.my.cnf' do
  mode 0600
  variables({
    :host => 'localhost',
    :user => 'root',
    :password => node[:your_cookbook][:db][:root_password],
  })
end

(其中node[:your_cookbook][:db][:root_password]是包含MySQL root密碼的屬性)

安全注意 :為簡單起見,我以root用戶身份進行導入。 如果要導入的.sql文件不是來自受信任的源,則需要以受限用戶身份運行mysql ,並使用只能訪問相關數據庫的有限db用戶連接到MySQL。

最后,我在實際執行導入的配方中添加了另一個資源:

backup_sql = '/path/to/the/db-backup.sql'
db_last_modified = "/etc/db-#{node[:your_cookbook][:db][:name]}.lastmodified"

execute 'restore backup' do
  command "mysql #{node[:your_cookbook][:db][:name]} <'#{backup_sql}' && touch '#{db_last_modified}'"
  not_if { FileUtils.uptodate?(db_last_modified, [backup_sql]) }
end

(其中node[:your_cookbook][:db][:name]是要恢復的MySQL數據庫的名稱。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM