web-dev-qa-db-ja.com

データベースをあるサーバーから別のサーバーに移動するにはどうすればよいですか?

MySQLテーブルを1つの物理サーバーから別のサーバーに移動するにはどうすればよいですか?

この正確なシナリオのように: innodbテーブルを使用するMySQLサーバーがあり、サイズは約20GBです。

新しいサーバーに移動したいのですが、これを行う最も効率的な方法は何ですか?

142
John

私のお気に入りの方法は、sqldumpコマンドをsqlコマンドにパイプすることです。すべてのデータベースまたは特定のデータベースを実行できます。たとえば、

mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword 

すべてのデータベースで

mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver 

唯一の問題は、データベースが大きすぎてパイプが壊れた場合です。その場合、テーブルごとに、または以下で説明する他の方法のいずれかを実行できます。

84
David Hall

私は最近、次の戦略で30GBデータベースを移動しました:

古いサーバー

  • MySQLサーバーを停止する
  • datadir の内容をディスク上の別の場所にコピーします(~/mysqldata/*
  • Mysqlサーバーを再起動します(ダウンタイムは10〜15分でした)。
  • データを圧縮する(tar -czvf mysqldata.tar.gz ~/mysqldata
  • 圧縮ファイルを新しいサーバーにコピーする

新しいサーバー

  • mysqlをインストールします(開始しないでください)
  • 圧縮ファイルを解凍(tar -xzvf mysqldata.tar.gz
  • mysqldataの内容を datadir に移動します
  • 新しいサーバーでinnodb_log_file_sizeが同じであることを確認してください。そうでない場合は、古いログファイルをコピーしないでくださいmysqlはこれらを生成します
  • Mysqlを起動
67
Derek Downey

MySQL 5.0認定調査ガイド によると、第32章セクション32.3.4、ページ456,457に記載されているバイナリポータビリティの条件以下を引き出す:

あるマシンで作成されたバイナリバックアップを作成し、それを別のアーキテクチャを持つ別のマシンで使用する場合は、バイナリの移植性が重要です。たとえば、バイナリバックアップの使用は、あるMySQLサーバーから別のMySQLサーバーにデータベースをコピーする1つの方法です。

MyISAMの場合、バイナリ移植性とは、MyISAMテーブルのファイルを、あるMySQLサーバーから別のマシンの別のMySQLサーバーに直接コピーでき、2番目のサーバーがテーブルにアクセスできることを意味します。

InnoDBの場合、バイナリの移植性とは、あるマシンのMySQLサーバーから別のマシンの別のサーバーにテーブルスペースファイルを直接コピーでき、2番目のサーバーがテーブルスペースにアクセスできることを意味します。デフォルトでは、サーバーによって管理されるすべてのInnoDBテーブルが一緒にテーブルスペースに格納されるため、テーブルスペースの移植性は、すべての個々のInnoDBテーブルが移植可能かどうかの関数です。 1つのテーブルでも移植できない場合、どちらもテーブルスペースではありません。

MyISAMテーブルとInnoDBテーブルスペースは、次の2つの条件が満たされた場合、1つのホストから別のホストにバイナリ移植可能です。

  • 両方のマシンは2の補数の整数演算を使用する必要があります
  • 両方のマシンでIEEE浮動小数点形式を使用する必要があります。そうでない場合、テーブルに浮動小数点列(FLOATまたはDOUBLE)が含まれていてはなりません。

実際には、これら2つの条件にはほとんど制限がありません。最近のハードウェアでは、2の補数の整数演算とIEEE浮動小数点形式が標準です。 InnoDBバイナリポータビリティの3番目の条件は、テーブルとデータベースに小文字の名前を使用する必要があることです。これは、InnoDBがこれらの名前をWindowsの内部で(データディクショナリに)小文字で格納するためです。小文字の名前を使用すると、WindowsとUnixの間でバイナリの移植性が可能になります。小文字の名前を強制的に使用するには、オプションファイルに次の行を記述します。

[mysqld]
lower_case_table_names=1

テーブルごとのテーブルスペースを使用するようにInnoDBを構成すると、バイナリポータビリティの条件が拡張され、InnoDBテーブルの.ibdファイルも含まれるようになります。 (すべてのInnoDBテーブルに関する情報を格納するデータディクショナリが含まれているため、共有テーブルスペースの条件は引き続き適用されます。)

バイナリの移植性の条件が満たされていない場合は、MyISAMまたはInnoDBテーブルを(mysqldumpなどで)テキスト形式を使用してダンプし、宛先サーバーに再ロードすることで、サーバー間でコピーできます。

ストレージエンジンに基づいて2つの主な方法で個々のテーブルを移動します。

この例では、次のことを想定しています。

  1. datadirは/ var/lib/mysqlです
  2. mydbというデータベース
  3. mydbデータベースのテーブルはmytableと呼ばれます。

MyISAMテーブル

Mydb.mytableがMyISAMストレージエンジンを使用する場合、テーブルは物理的に3つの個別のファイルとして表されます

  1. /var/lib/mysql/mydb/mytable.frm(.frmファイル)
  2. /var/lib/mysql/mydb/mytable.MYD(.MYDファイル)
  3. /var/lib/mysql/mydb/mytable.MYI(.MYIファイル)

.frmにはテーブル構造が含まれています
。MYDにはテーブルデータが含まれています
。MYIにはテーブルインデックスページが含まれています

これらのファイルは相互に依存して使用され、mysqlの論理的な観点からテーブルを表します。これらのファイルにはそれ以上の論理的な関連付けがないため、テーブルを1つのDBサーバーから別のDBサーバーに移行します。 WindowsサーバーからLinuxサーバーまたはMacOSへの移行も可能です。もちろん、mysqlをシャットダウンして3つのテーブルファイルをコピーすることもできます。以下を実行できます。

LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;

1つのSSHセッションで、テーブルを読み取り専用として保持し、ロックを24時間保持します。 1秒後、別のsshセッションでコピーを実行します。次に、24時間ロックでmysqlセッションを終了します。 24時間待つ必要はありません。

InnoDBテーブル

前述の認定書からの引用に基づいて、特定のInnoDBテーブルをバックアップする方法を決定する多くの要因があります。単純、明快、簡潔にするために、--single-transactionパラメータを使用して目的のテーブルのmysqldumpを実行するだけで、テーブルの完全なポイントインタイムダンプを取得できます。テーブルが1つだけ必要な場合は、InnoDBセマンティクスを使用する必要はありません。そのダンプファイルを任意のMySQLサーバーにリロードできます。

2つの質問がここにマージされたため、(jcolebrand):編集

DBのパフォーマンスが遅い場合でも、mysqlがまだserverAで実行されている場合でも、古いサーバー(ServerA)から新しいサーバー(ServerB)への一連のrsyncを実行できます。

ステップ01)ServerAと同じバージョンのmysqlをServerBにインストールします

ステップ02)ServerAで、mysqlからSET GLOBAL innodb_max_dirty_pages_pct = 0;を実行し、約10分(これにより、InnoDBバッファープールからダーティページがパージされます。また、mysqlのシャットダウンをより高速に実行するのに役立ちます)データベースがすべてMyISAMの場合は、このステップをスキップできます。

ステップ03)rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

ステップ04)rsyncが1分未満になるまでステップ03を繰り返します。

ステップ05)ServerAのservice mysql stop

ステップ06)もう一度rsyncを実行します

ステップ07)scp ServerA:/etc/my.cnf ServerB:/etc/

手順08)ServerBでのservice mysql start

ステップ08)ServerAのservice mysql start(オプション)

試してみる !!!

警告

このようなレプリケーションスレーブを作成できます。マスター/etc/my.cnfにサーバーIDを明示的に設定し、スレーブ/etc/my.cnfにサーバーIDの別の番号を設定することを忘れないでください。

34
RolandoMySQLDBA

データベーススキーマ全体を移動し、最初のデータベースを停止する場合は、mysqldumpも必要ありません(したがって、転送時に一貫しています)。

  1. データベースを停止します(またはロックします)。
  2. Mysqlデータファイルがあるディレクトリに移動します。
  3. フォルダー(およびその内容)を新しいサーバーのmysqlデータディレクトリに転送します。
  4. データベースのバックアップを開始します
  5. 新しいサーバーで、「データベースの作成」コマンドを発行します。
  6. ユーザーを再作成し、権限を付与します。

Mysqldumpがユーザーとアクセス許可を処理したのか、それともデータだけを処理したのか覚えていませんが、処理したとしても、ダンプを実行して実行するよりもway高速です。 mysqlデータベースをダンプして他のRDBMSに再挿入する必要がある場合、ストレージオプションを変更する必要がある場合(innodbとmyisam)、またはmysqlの主なバージョンを変更する場合(ただし、私はこれを4と5の間にやったと思います)

29
Joe

特定のテーブルを移動したいだけの場合:

mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql

同じコマンドで、上記のテーブル名をさらに指定できます。コマンドが完了したら、databasename.tablename.sqlファイルを他のサーバーに移動し、次を使用して復元します。

mysql -u username -ppassword databasename < databasename.tablename.sql

Back .sqlファイルはmysqldumpプログラムを使用して作成され、リストアはmysqlに直接行われることに注意してください。

12
StanleyJohns
  1. SSHアクセス権がある場合は、コマンドラインからmysqldumpを使用できます
  2. Sshアクセス権はないがphpMyAdminアクセス権がある場合は、それを使用してエクスポート/インポートできます。
  3. PhpMyAdminアクセス権がない場合は、ダンプしてインポートする便利なphpスクリプトがいくつかあります(ただし、私自身の経験から言うと、phpMyAdminほど信頼できるスクリプトは見つかりませんでした)。

実際のデータベースファイルを移動する可能性があるかもしれません(私のインストールでは、それらは/ var/lib/mysqlにあります)が、実際にどのように動作/機能するかはわかりません。

7
poelinca

ダウンタイムをとる必要があります。ネットワークの速度によっては、しばらく時間がかかります。 Linux/UnixでMySQLを実行していると仮定します。ここに私が使用するプロセスがあります:

  1. ソースホストでmysqlデーモンを停止します。
  2. ターゲットホストにtmpフォルダを作成して、ファイルを受信します。
  3. screenを使用して、sshが切断されても存続するシェルセッションを作成します。
  4. ホスト間でファイルを転送するには、rsyncを使用します。次のようなもの:rsync -avhP source user @ targethost:/ path/to/folder /
  5. テストケースを実行して、転送で何も失われていないことを確認します。

次に、通常どおり、ローカルMySQLをセットアップします。

*注:rsyncで-cパラメータを使用して転送にチェックサムを追加することもできますが、これはCPU速度によっては遅くなります。

5
randomx

以前の答えはすべてうまくいくと思いますが、転送中にデータベース名を設定する問題には実際には対処していません。

これは、私がbashを使用して実行した方法です。

rsyncよりもscpを使用した方がよい場合があり、頻繁に実行する場合はファイルを圧縮しないでください。

私のソースサーバー:

me@web:~$ d=members
me@web:~$ mysqldump $d | gzip > $d.sql.gz
me@web:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz

私の宛先サーバー:

me@sandbox:~$ d1=members
me@sandbox:~$ d2=members_sb
me@sandbox:~$ mysqladmin create $d2
me@sandbox:~$ cat $d1.sql.gz | gunzip |  mysql $d2

どちらかのマシンで進行状況を確認します。

me@sandbox:~$ ls *.gz 
me@sandbox:~$ cat $d.sql.gz | gunzip |  less

これはすべて、両方のマシンのホームディレクトリに MySQL configuration ファイルがあることを前提とし、権限を設定します。

$ echo "
[client]
user=drupal6
password=metoknow
Host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf
4
ErichBSchulz

DTestのメソッドがubuntuとosx間のコピーにも機能することを確認できます。

ダンプなどを行わずにすべてのデータベースをコピーするには:

Mysqlのクリーンなmysqlがあることを確認します(mysqlからダウンロードしたdmgをインストールします http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg )、その(非常に重要)は一度も実行されていません。

Mac上の/ usr/local/mysql/data /のコンテンツの上にあるUbuntuマシンから/ var/lib/mysql /フォルダーのコンテンツをコピーします。 ubuntuマシン上のフォルダーを取得するためのアクセス権を取得するには、Sudoを使用する必要がありました。

Sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
Sudo chown -R foouser /home/foouser/mysql_data_folder

Scpを使用してフォルダをコピーしました。

始める前に、macのmysqlフォルダーのコピーを取得して、何も台無しにしないようにしてください。

フォルダをコピーしたら、Macマシンで次の手順を実行します。

Sudo chown -R _mysql /usr/local/mysql/data/
Sudo chgrp -R wheel /usr/local/mysql/data/
Sudo chmod -R g+rx /usr/local/mysql/data/

Mysqlサーバーを初めて起動します([システム設定]-> [mysql]の下の設定ペインから)。すべてのユーザーとデータベースが正しく設定されているはずです。

これは、ubuntu 64ビット11.10のmysql 5.1.61およびosx lion(macbook pro)のmysql 5.1.63で動作しました。

4
paalvibe

別のmysqlサーバーdbに移動していますか?もしそうなら、それをエクスポートしてください

# mysqldump -u username -ppassword database_name > FILE.sql
3
seyz4all

一般的なLinuxメソッド:

/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf

mysqldとmysqld_safe(該当する場合)の両方のdatadir(およびソケット)を編集して、新しい場所を指すようにします。

/etc/init.d/mysql start

私がこれを投稿したのは、これを実行するための最小の手順を単純にリストした人は誰もいないようで、個人的にはこれが最も簡単な方法だと感じたからです。

3
seeafish

1つのサーバーから別のサーバーにデータベース全体を転送するための2つの簡単なステップを提案します。

ステップ1mysqldumpを使用して、ソースサーバーのデータベースの完全バックアップを実行します。

ステップ2rsyncコマンドを使用して、データベース全体を宛先サーバーに転送できます。

2
Rudra

おそらく、これはより良い方法です:

バージョン1:データファイルのコピー(MYISAMのみ)

ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start

ssh server2 service restart mysql

  • データベースファイルが読み取り専用の場合は、サーバーの停止をスキップできます。

バージョン2:mysqldump

Pigzをインストールします-最近のXeonまたはOpteronプロセッサーでは、特に2つ以上のCPUがある場合、gzipよりもはるかに高速です。

ssh server1 
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location

ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..

バージョン:マスター/スレーブ+ mysqldump/file-copy

In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop"; 
then do version 1 or version 2

脚本:

touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end

ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz

PS:

小さなテーブルをコピーするには:

ssh server1 mysqldumpスキーマテーブル| ssh server2 mysqlスキーマ

2
parf