MySQLテーブルを1つの物理サーバーから別のサーバーに移動するにはどうすればよいですか?
この正確なシナリオのように: innodbテーブルを使用するMySQLサーバーがあり、サイズは約20GBです。
新しいサーバーに移動したいのですが、これを行う最も効率的な方法は何ですか?
私のお気に入りの方法は、sqldumpコマンドをsqlコマンドにパイプすることです。すべてのデータベースまたは特定のデータベースを実行できます。たとえば、
mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword
すべてのデータベースで
mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver
唯一の問題は、データベースが大きすぎてパイプが壊れた場合です。その場合、テーブルごとに、または以下で説明する他の方法のいずれかを実行できます。
私は最近、次の戦略で30GBデータベースを移動しました:
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)tar -xzvf mysqldata.tar.gz
)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つの主な方法で個々のテーブルを移動します。
この例では、次のことを想定しています。
MyISAMテーブル
Mydb.mytableがMyISAMストレージエンジンを使用する場合、テーブルは物理的に3つの個別のファイルとして表されます
.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の別の番号を設定することを忘れないでください。
データベーススキーマ全体を移動し、最初のデータベースを停止する場合は、mysqldumpも必要ありません(したがって、転送時に一貫しています)。
Mysqldumpがユーザーとアクセス許可を処理したのか、それともデータだけを処理したのか覚えていませんが、処理したとしても、ダンプを実行して実行するよりもway高速です。 mysqlデータベースをダンプして他のRDBMSに再挿入する必要がある場合、ストレージオプションを変更する必要がある場合(innodbとmyisam)、またはmysqlの主なバージョンを変更する場合(ただし、私はこれを4と5の間にやったと思います)
特定のテーブルを移動したいだけの場合:
mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql
同じコマンドで、上記のテーブル名をさらに指定できます。コマンドが完了したら、databasename.tablename.sqlファイルを他のサーバーに移動し、次を使用して復元します。
mysql -u username -ppassword databasename < databasename.tablename.sql
Back .sqlファイルはmysqldumpプログラムを使用して作成され、リストアはmysqlに直接行われることに注意してください。
実際のデータベースファイルを移動する可能性があるかもしれません(私のインストールでは、それらは/ var/lib/mysqlにあります)が、実際にどのように動作/機能するかはわかりません。
ダウンタイムをとる必要があります。ネットワークの速度によっては、しばらく時間がかかります。 Linux/UnixでMySQLを実行していると仮定します。ここに私が使用するプロセスがあります:
次に、通常どおり、ローカルMySQLをセットアップします。
*注:rsyncで-cパラメータを使用して転送にチェックサムを追加することもできますが、これはCPU速度によっては遅くなります。
以前の答えはすべてうまくいくと思いますが、転送中にデータベース名を設定する問題には実際には対処していません。
これは、私が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
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で動作しました。
別のmysqlサーバーdbに移動していますか?もしそうなら、それをエクスポートしてください
# mysqldump -u username -ppassword database_name > FILE.sql
一般的なLinuxメソッド:
/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf
mysqldとmysqld_safe(該当する場合)の両方のdatadir(およびソケット)を編集して、新しい場所を指すようにします。
/etc/init.d/mysql start
私がこれを投稿したのは、これを実行するための最小の手順を単純にリストした人は誰もいないようで、個人的にはこれが最も簡単な方法だと感じたからです。
1つのサーバーから別のサーバーにデータベース全体を転送するための2つの簡単なステップを提案します。
ステップ1:mysqldumpを使用して、ソースサーバーのデータベースの完全バックアップを実行します。
ステップ2:rsyncコマンドを使用して、データベース全体を宛先サーバーに転送できます。
おそらく、これはより良い方法です:
バージョン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スキーマ