2012-02-28 17 views
6

こんにちは、どのようにmysqlデータベースを最も簡単かつ迅速に移動するには?私は別のサーバーにMySQLデータベースを移動する必要が

それは私が両方のサーバーでrootアクセスを持つことができ、ほぼ5ギガバイト

ですか?

+0

私はこのような質問がhttp://dba.stackexchange.com/に属していると思いますが、私はそれを移行するために移動すると思いますが、私は担当者がありません。おそらく、Pまたはをhttp://www.Superuser.comしかし、それはデータベースに固有なので、前者を疑うだろう。 – Jordan

答えて

22

通常あなたは次のようにデータベースのコピーやバックアップを作成するためのmysqldumpを実行します。

$ mysqldump -u user -p db-name > db-name.out 

コピーDB-name.outファイルのリモートMySQLサーバへのSFTP/SSHを使用して:

$ scp db-name.out [email protected]:/backup 

は、データベースを復元リモートサーバーで(SSH経由でログイン):

$ mysql -u user -p db-name < db-name.out 

OR

$ mysql -u user -p 'password' db-name < db-name.out 

MySQLデータベースを1台のコンピュータ/サーバから別のコンピュータ/サーバにコピーするにはどうすればよいですか?

簡単な答えは、sshまたはmysqlクライアントを使用して、あるコンピュータ/サーバーから別のコンピュータ/サーバーにデータベースをコピーできます。

あなたはmysqldumpをしてmysqlのコマンドを使用して、1回のパスで上記のすべての3つのコマンドを実行します(安全でない方法で、あなたがVPNを使用したり、ネットワークを信頼している場合にのみ使用)することができます

$ mysqldump db-name | mysql -h remote.box.com db-name 

利用sshをあなたはドンが」

$ mysqldump db-name | ssh [email protected] mysql db-name 

OR

$ mysqldump -u username -p'password' db-name | ssh [email protected] mysql -u username -p'password db-name 

あなたがC:tは、リモートのMySQLサーバ(安全な方法)に直接アクセスすることが

$ mysqldump db-name foo | ssh [email protected] mysql bar 

OR

$ mysqldump -u user -p'password' db-name foo | ssh [email protected] mysql -u user -p'password' db-name foo 

ほとんどすべてのコマンド

は、下のパイプを使用して実行することができます:ちょうどリモートデータベース(およびリモートのMySQLサーバremote.box.com)にfooという名前のテーブルバーと呼ばれる同じ構文を使用してコピーUNIX/Linuxのoses。 Reference

よろしくから

より、

+3

ダンプの拡張挿入オプションを使用していることを確認してください(デフォルトでオンになっている可能性がありますが、肯定的ではないと思われます)、復元速度が大幅に低下します。 –

+2

*ここから取得:http://www.cyberciti.biz/tips/howto-copy-mysql-database-remote-server。html –

13

あなたがルートを持っている場合、あなたはそれが速くmysqldumpを避けるかもしれません。宛先サーバーでDBを作成し、データベースファイルを直接コピーすることができます。仮定user先サーバーのmysqlのディレクトリへのアクセス権を持っている:ここ

[[email protected]]# /etc/init.d/mysqld stop 
[[email protected]]# cd /var/lib/mysql/[databasename] 
[[email protected]]# scp * [email protected]:/var/lib/mysql/[databasename] 
[[email protected]]# /etc/init.d/mysqld start 

重要なものは次のとおりでmysqldを開始する前に、ファイルの所有権と権限が先に正しいことを確認し、DBファイルをコピーする前に、両方のサーバー上でmysqldを停止します宛先サーバー。時間はここにあなたの優先された状態で

[[email protected]]# chown mysql:mysql /var/lib/mysql/[databasename]/* 
[[email protected]]# chmod 660 /var/lib/mysql/[databasename]/* 
[[email protected]]# /etc/init.d/mysqld start 

、圧縮の使用は時間が(gzipようなもので)圧縮/解凍を待っていることは、非圧縮データを送信する無駄な時間よりも大きくなります失われたかどうかに依存します。つまり、接続の速度です。バックアップの自動化された方法については

+0

これははるかに簡単な方法です。なぜこれが上がらないのか分かりません。 MySQLサーバーは元のファイルのコピーです。私はちょうど約5分でユニークなサーバーにWebサーバー全体をクローンしました。 – David

+0

上記の手順を実行しましたが、「ERROR 1146(42S02):テーブル 'sample.user'が存在しません」というメッセージが表示されます。ユーザーテーブルを印刷しようとしました。何か案が ?? – Bathakarai

+0

アイデア:間違ったパスのユーザーテーブルのファイル、間違ったファイルのアクセス許可、または構成が異なるサーバー。 – Umbrella

2

MySQLデータベース:バックアップのいずれかの形をしているに

の前提条件が稼働しているシステムのパフォーマンスを妨げることなく、タスクを完了するか、ユーザーを妨害する一日の理想的な時間を見つけることです。このメモでは、データベースのサイズをドライブのI/O速度とともに考慮する必要があります。これは、データベースが増加するにつれて指数関数的に重要になります(ドライブの数データベースが格納されていない代替ドライブは、読み書きの両方を実行しないヘッドのためにスピードが増します)。この読みやすさを維持するために、私はデータベースが管理可能なサイズ(100MB)環境は午前9時から午後5時の間の仕事で、実際のストレスや休暇中の他の稼動システムはありません。

最初の手順は、ローカルマシンにroot権限でログインすることです。ルートシェルでは、MySQLユーザーは読み取り専用権限で作成する必要があります。これを行うには、コマンドを使用してMySQLシェルを入力します。

mysql -uroot -ppassword 

次に、ユーザがバックアップする必要のあるデータベースへの読み取り専用の権限で作成する必要があります。この場合、スクリプトまたはプロセスが後で使用される場合に備えて、特定のデータベースをユーザーに割り当てる必要はありません。 、完全な読み取り権限を持つユーザーを作成してMySQLのシェルで次のコマンドを入力するには:

grant SELECT on *.* TO [email protected] IDENTIFIED BY ' backuppassword'; 
FLUSH PRIVILEGES; 

作成したMySQLのユーザーと、それはMySQLのシェルを終了し、終了を使用してrootのシェルに戻って落下しても安全です。ここから、バックアップコマンドを実行するスクリプトを作成する必要がありますが、これはBASHを使用して簡単に実行できます。このスクリプトは、cronジョブを使用して毎晩スクリプトを実行するため、この例では「backupscripts」という新しいディレクトリにスクリプトを配置します。このディレクトリを作成するには、rootシェルで次のコマンドを使用します。

mkdir /backupscripts 

我々はまた、ローカルに私たちのバックアップを保存するディレクトリを作成する必要があります。このディレクトリ名を "backuplogs"と名付けます。発行ディレクトリを作成するには、rootシェルで次のコマンド:

mkdir /backuplogs 

次のステップでは、ルート証明書を使用してリモートマシンにログインしてコマンドを使用して、「バックアップのユーザー」を作成するために、次のようになります。

useradd -c "backup user" -p backuppassword backupuser 

バックアップ用のディレクトリを作成します。

mkdir /backuplogs/ 

ログアウトする前に、コマンドを使用して、今後の参考のためにリモートホストのIPアドレスをつかむ:

ifconfig -a 

eth0は、有線ネットワーク接続の標準インターフェイスです。このIP_ADDRに注意してください。

最後に、リモートサーバーからログアウトし、元のホストに戻ります。

次に、リモートではなくホストのローカルマシン上のスクリプトを作成します。私たちはVIMを使っています(あなたがnanoかemacsのファンなら、私を抱かないでください - しかしここではVIMを使ってファイルを編集する方法は記載しません)。まずファイルを作成し、mysqldump 、データベースをバックアップします。また、scpを使用します。データベースを作成したら、ファイルを圧縮して保存します。指示を満たすためにファイルをSTDOUTに読みます。最後に、7日以上経過したファイルを確認します。削除してください。これを行うには、スクリプトは次のようになります。私たちは、パスワードのために私たちのスクリプトを実行するたびにプロンプ​​トが表示されていないように

vim /backupscripts/mysqldbbackup.sh 

#!/bin/sh 

# create a temporary file for the schema to be stored 
BACKUPDIR = /backuplogs/ 
TMPFILE = tmpout.sql 
CURRTIME = $(date +%Y%m%d).tgz 

#backup your database 
mysqldump -ubackupdbuser -pbackuppassword databasename > $BACKUPDIR$TMPFILE 

#compress this file and store it locally with the current date 
tar -zvcf /backuplogs/backupdb-$CURRTIME $BACKUPDIR$TMPFILE 

#per instructions - cat the contents of the SQL file to STDOUT 
cat $BACKUPDIR$TMPFILE 

#cleanup script 
# remove files older than 7 days old 
find $BACKUPDIR -atime +7 -name 'backup-db-*.tgz' -exec rm {} \; 

#remove the old backupdirectory from the remote server 
ssh [email protected] find /backuplogs/ -name 'backup-db-*.tgz' -exec rm {} \; 

#copy the current backup directory to the remote server using scp 
scp -r /backuplogs/ [email protected]:/backuplogs/ 

################# 
# End script 
################# 

このスクリプトで所定の位置に、我々は、セットアップのsshキーする必要があります。私たちは、SSH-keygenは、コマンドでこれをやる:

ssh-keygen -t rsa 

は、プロンプトにパスワードを入力します - これはあなたの秘密鍵を作成します。これを共有しないでください。

共有する必要のあるファイルは、公開鍵です。ファイルcurrent_home/.ssh/id_rsa.pubに保存されています。次のステップは、この公開鍵をリモートホストに転送することです。キーを取得するには、次のコマンドを使用します。

cat current_home/.ssh/id_rsa.pub 

ファイル内の文字列をコピーします。コマンドを使用して、リモート・サーバに次のssh:

ssh [email protected] 

パスワードを入力し、[ファイル/.ssh/authorized_keysファイルを編集します。 id_rsa.pubファイルから取得した文字列をauthorized_keysファイルに貼り付けます。エディタを使用して変更をファイルに書き込み、エディタを終了します。リモートサーバーからログアウトし、以前のsshコマンドを使用してリモートサーバーに再度ログインしようとすると、RSAキーが機能していることをテストします。パスワードを尋ねられない場合は、正しく動作しています。リモートサーバーから再度ログアウトします。

最終的には、ユーザーがログオフした後に毎晩これを実行するcronジョブを作成する必要があります。 crontabを使用して、現在のユーザーファイル(root)を編集して、すべての権限の問題を回避します。 *注 - これは、データの削除、セキュリティ上の脆弱性など、スクリプトにエラーがある場合、深刻な意味を持つ可能性があります。あなたの作業をすべてダブルチェックし、自分のシステムを信頼してください。現在のサーバー*にアクセス許可を設定する必要があります。 crontabのエディター(それはあなたのデフォルトのテキストエディタで開きます)で、我々は12で毎晩を実行するために、私たちのスクリプトを設定しようとしている一方で

crontab -e 

:あなたの現在のcrontabを編集するには、我々は、コマンドを発行します:30am。

30 0 * * *バッシュ/backupscripts/mysqldbbackup.sh

このファイルを保存し、エディタを終了:エディタに新しい行を入力します。 cronjobを正常に動かすには、crondサービスを再起動する必要があります。これを行うには、次のコマンドを発行します。

/etc/init.d/crond restart 
関連する問題