8

開発環境の設定を自動化するためのシェフスクリプトを書いています。データベースを作成して権限を付与することはできますが、作成したばかりのデータベースに 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をあまりやったことがないので、理解するのが難しいです。どうすればこれができるか知っている人はいますか?

4

3 に答える 3

5

ファイル パス エラーであり、chef solo を使用している場合は、次のように、solo.rb内で指定されたパスを使用してみてください。

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

一般的な注意事項として、mysql ユーザーおよびデータベース管理タスクにデータベース クックブックを使用することを検討してください。必要なクックブックの依存関係をセットアップしたら、次のようなコードをメイン レシピの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

シェフディレクトリ内にデータベースファイルを保存すると本当に遅くなるため、最後のものはテストしていません。

参照: SQL ファイルを mysql にインポートする

于 2013-07-07T23:09:25.710 に答える
3

MySQL コマンド ライン クライアントからバックアップを作成できますが、SQL クエリ内からは作成できません。シェルからコマンドを実行する必要があります。executeリソースがあなたのためにトリックを行うかもしれないと私は信じています:

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

于 2011-05-20T04:09:46.433 に答える
1

私は Ruby の専門家ではありませんが、コマンド ライン ツール.sqlを利用して、Chef に大きなファイルをインポートさせることができました。mysql解決する必要があった課題:

  • 数百 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 データベースの名前です。)

于 2015-07-20T23:49:05.350 に答える