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


136

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

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

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


4
私はxtrabackup percona.com/docs/wiki/を使用します。コピーすることに非常に似ていますが、サーバーを実行し続けることができ、主にinnodbテーブル(使用していると言います)を使用すると仮定すると、「ホット」と見なすことができますバックアップも。
ジョナサン

このツールを使用している他の人の恩恵は受けません。それは無料/オープンソースであり、会社によって作成されたものであるにもかかわらず、その会社からのサポートを購入することを考慮する必要がないほど使いやすいです。
ジョナサン

回答:


80

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

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

ですべてのデータベースを実行できます

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

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


4
ヒント:どちらのデータベースもリモート接続を許可していない場合は、を介してパイプしてくださいnetcat
バートヴァンヒューケロム

1
これが機能するためには、リモートサーバー上に同じ名前の空のデータベースを作成し、そのデータベースの名前をコマンドの最後に追加する必要がありました。
ツークヴァルト

1
これはエレガントですが、圧縮なしでは20GBのデータベースに十分なほど高速ではありません。
ダディ32

このソリューションは、完全に制御されたネットワークのみに適しています(安全なプライベートネットワーク上にある場合のみ、インターネットではなく読み取り)。しかし、迅速かつ簡単なソリューション!
-tdaget

これは超高速です!しかし、@ Zugwaltが言ったことは私にも当てはまりました。データベースを作成する(空の)addコマンドの最後にデータベース名を追加するまで、コマンドは機能しませんでした。
スキー

65

私は最近、次の戦略で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を起動します

1
圧縮/解凍後にコピーをスキップします。sshを使用してネットワーク上でtarをストリーミングするか、(インターネットではなく安全なプライベートネットワークでのみ読み取ります)netcatを使用して暗号化のオーバーヘッドを回避します。また、ローカルネットワーク上の場合は、あなたは、高速ネットワークパイプを持っている場合は、圧縮を行う釘付けコアスピニングにボトルネック転送見つける、gzippingをスキップ
atxdba

これはinnodbとmyisamの両方で機能しますか?また、mysqlユーザーもdatadirにありますか?
giorgio79

2
ibdataファイルも移動する限り、@ giorgio79を確認してください。デフォルトでは、これらはdatadirにあります。MySQLユーザーは、ユーザーテーブルスペースのmysqlフォルダーに保存されます。
デレクダウニー

2
この手順は、WindowsからLinuxに移行する場合に機能しますか?
ypercubeᵀᴹ

2
@TypoCubeᵀᴹ応答に2年以上かかることは残念ですが、「はい、WindowsからLinuxまで動作します」と誰かが断定的に言うのを助けてくれました。私の場合、Windows Server 2012 R2からCent OS(Red Hat 4.8.5-11)に移行しました。特定のmysqlバージョンはMaria DB 10.1でした。規定どおり、両方のmysqlサービスを停止し、データディレクトリをrsyncし、新しいサーバーでmysqlサービスを開始すると、すべてのデータベース、データベーステーブル、およびデータベースユーザーは完全に無傷でした。
-WEBjuju

30

MySQL 5.0 Certification Study Guideによると、第32章のセクション32.3.4、ページ456,457には、以下をもたらすバイナリポータビリティ条件が記載されています。

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

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

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

MyISAMテーブルとInnoDBテーブルスペースは、2つの条件が満たされている場合、ホスト間でバイナリポータブルです。

  • 両方のマシンで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. mytableデータベースの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の論理的な観点からテーブルを表すために相互に依存して使用されます。これらのファイルにはそれ以上の論理的な関連付けがないため、ある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が持っているServerBに同じバージョンのmysqlをインストールする

ステップ02)ServerAで、SET GLOBAL innodb_max_dirty_pages_pct = 0;mysqlから約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)service mysql stopServerAで

ステップ06)もう1つのrsyncを実行します

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

ステップ08)service mysql startServerBで

ステップ08)service mysql startServerAで(オプション)

試してみる !!!

警告

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


29

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

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

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


これは、特にsysadmin / DBAの場合、より効率的です。ところで、mysqldumpを使用し--all-databasesてmysqlスキーマをダンプします。次のマシンでmysqlを起動すると、同じメジャーリリースのMySQLを使用して他のマシンにデータフォルダを転送した場合に、アクセス許可が表示されます。(MySQL 5.5.xからMySQL 5.5.x、MySQL 5.1.xからMySQL 5.1.x、MySQL 5.0.xからMySQL 5.0.x)
RolandoMySQLDBA

4
@Joe、はい、mysqldumpこれらはmysqlスキーマ内に保存されるため、ユーザーとパーミッションを処理します。
シュロミノアチ

このアプローチは、AWSなどのクラウドホスティングで特に役立ちます。mysqlを停止し、現在のサーバーからアンマウントしてデタッチできます。新しいサーバーに接続してマウントし、mysqlを起動します。ボリュームが同じサーバーファームに残っていれば、コピーのオーバーヘッドはありません。
-LateralFractal

12

特定のテーブルを移動するだけの場合:

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

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

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

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


7
  1. sshアクセスがある場合は、コマンドラインからmysqldumpを使用できます
  2. sshアクセス権はないが、phpMyAdminアクセス権は持っている場合、それを使用してエクスポート/インポートできます。
  3. phpMyAdminにアクセスできない場合、ダンプおよびインポートする便利なphpスクリプトがあります(ただし、私自身の経験から言えば、phpMyAdminほど信頼できるものは見つかりませんでした)。

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


5

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

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

その後、通常どおりローカルMySQLのセットアップを進めます。

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


4

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

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

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

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

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

これは私がちょうどbashでそれをやった方法です:

頻繁に行う場合rsyncscp、を使用してファイルを圧縮しない方がよい場合があります。

ソースサーバーで:

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構成ファイルがあり、アクセス許可を設定していることを前提としています

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

3

別のmysqlサーバーdbに移動していますか?使用する場合は、エクスポートを行います

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

Mysqldump?それはあなたが少量のデータを扱っているときですか?
ああチンブーン

2
最近、小/大は非常に主観的だと思います。私は質問のタイトルを見たとき、私は「大きい」と見なされるために20ギガバイトよりたくさん大きくなるようにデータベースを期待していた...
アーロン・ベルトラン

3

一般的なLinuxの方法:

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

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

/etc/init.d/mysql start

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


2

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

バージョン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サービス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 ..

バージョン3:マスター/スレーブ+ 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

1つのサーバーから別のサーバーにデータベース全体を転送する2つの簡単な手順をお勧めします。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.