Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Importing Mysql database using Ruby/Chef Recipe for Vagrant

I am writing a chef script to automate setting dev environments. I can get a database created and grant privileges but I am trying to find out a way to import a mysql dump file into the database that has just been created.

My code for granting the access is

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

and I was hoping I would be able to do the following query #m.query("-u root -p root db_name < /project/db/import.sql")

but is just gives me an error.

I haven't done much Ruby so finding it hard to figure out. Anybody know how I can do this?

like image 367
Craig Ward Avatar asked May 15 '11 15:05

Craig Ward


2 Answers

If it's a file path error, and you're using chef solo, try using the path specified within solo.rb, like:

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

As a general note, consider using the database cookbook for mysql user and database management tasks. Once you setup the necessary cookbook dependencies, you can put code like this into your main recipe's 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

Haven't tested that last one because storing a database file within the chef directory really slows things down.

See also: Import SQL file into mysql

like image 195
s2t2 Avatar answered Oct 03 '22 21:10

s2t2


You can create a backup from the MySQL command line client, but not from within a SQL query. You need to execute the command from the shell. I believe the execute resource might do the trick for you:

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

like image 29
davidstamm Avatar answered Oct 03 '22 22:10

davidstamm