ホームページ >データベース >mysql チュートリアル >Mysql の百万レベルのデータ移行プロセスの記録に焦点を当てます。
このようなシナリオがあると仮定して、小さなプログラムを開発し、ダブル イレブン イベントの人気を利用して、1 か月であっという間に 100 万人以上のユーザーを獲得しました。小さなプログラム ページで、ポイントは WeChat ユーザーにテンプレート メッセージ通知を送信するために使用されます。
データ量が増えてきて、以前使用していたサーバーの容量が少し足りなくなってきました。最近、小さなプログラムのバックエンド開発に特化した新しいフレームワークを書いたので、元のデータを移行したいと考えています新しいシステムのデータベースに移行します。 4コア8Gマシンを購入し、データ移行を始めました。移行プロセスの簡単な記録を作成してみましょう。
通常の開発では、使用されるデータのバックアップおよび移行方法は、mysqldump ツールを使用して SQL ファイルをエクスポートし、その SQL ファイルを新しいデータベースにインポートしてデータ移行を完了することです。 [推奨: mysql ビデオ チュートリアル ]
実験の結果、mysqldump を使用して 100 万レベルのデータベースを SQL ファイルにエクスポートするには数分かかることと、エクスポートされた SQL ファイルのサイズが判明しました。約 1G です。その後、scp コマンドを使用して 1G SQL ファイルを別のサーバーにコピーします (これには数分かかる場合があります)。新しいサーバーのデータベースにデータをインポートするためにsourceコマンドを使用しましたが、一晩中実行しましたが、データはインポートされませんでした。CPUがいっぱいでした。
スクリプト移行
コマンド ラインからデータベースを直接操作してデータをエクスポートおよびインポートする方が便利ですが、データ量が増加します。この場合、多くの場合、時間がかかり、より高いサーバーのパフォーマンスが必要になります。データ移行に必要な時間がそれほど長くない場合は、データを移行するためのスクリプトを作成してみることができます。実際に試したことはありませんが、スクリプトの解決策はおそらく 2 つあると思います。
最初の方法は、移行ターゲット サーバーで移行スクリプトを実行し、ソース データ サーバーのデータベースにリモートで接続し、クエリ条件を設定してソース データをチャンクで読み取り、ターゲット データベースに書き込むことです。読んだあと。 。この移行方法は比較的非効率的である可能性があり、データのエクスポートとインポートは同期プロセスに相当し、読み取りが完了するまで待ってから書き込みを行う必要があります。クエリ条件が合理的に設計されている場合は、複数の移行スクリプトをマルチスレッド方式で開始して、並列移行の効果を実現することもできます。
2 番目の方法は、redis と組み合わせて、「実稼働および消費」の移行ソリューションを構築できます。ソース データ サーバーはデータ プロデューサーとして機能し、ソース データ サーバー上でマルチスレッド スクリプトを実行し、データベース内のデータを並行して読み取り、データを Redis キューに書き込みます。ターゲット サーバーはコンシューマとして、ターゲット サーバー上でマルチスレッド スクリプトも実行し、redis にリモート接続し、redis キュー内のデータを並行して読み取り、読み取ったデータをターゲット データベースに書き込みます。最初の方法と比較すると、この方法は非同期ソリューションであり、データのインポートとデータのエクスポートを同時に実行でき、データ転送ステーションとして redis を使用することで効率が大幅に向上します。
ここでは、Go 言語を使用して移行スクリプトを作成することもできます。ネイティブの同時実行機能を使用すると、データを並行して移行するという目的を達成し、移行効率を向上させることができます。
ファイル移行
最初の移行ソリューションは非効率すぎ、2 番目の移行ソリューションはエンコード コストが高くなります。比較とオンライン アフターを通じて探していた情報を分析した結果、最終的に mysql を使用することにしました。
select data into outfile file.txt、load data infile file.txt into table
コマンドは、インポートおよびエクスポート ファイルの形式で数百万のデータの移行を完了します。
ソース データベースにデータ ファイルをエクスポートします
select * from dc_mp_fans into outfile '/data/fans.txt';
データ ファイルをターゲット サーバーにコピーします
zip fans.zip /data/fans.txtscp fans.zip root@ip:/data/
ターゲット データベースでファイルをインポートします
unzip /data/fans.zipload data infile '/data/fans.txt' into table wxa_fans(id,appid,openid,unionid,@dummy,created_at,@dummy,nickname,gender,avatar_url,@dummy,@dummy,@dummy,@dummy,language,country,province,city,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy);
次の手順に従って、百万レベルのデータ テーブルのサーバー間移行を数分で完了します。
注意事項
mysqlでデータのinfileとintoへのロードを実行します。 outfile コマンドでは、mysql で secure_file_priv オプションを有効にする必要があります。'%secure%'; のような show global 変数を使用して、mysql でこのオプションが有効になっているかどうかを確認できます。デフォルト値の Null は、インポートおよびエクスポート コマンドが許可されていないことを示します処刑されることになる。
vim /etc/my.cnf を介して mysql 構成項目を変更し、secure_file_priv の値を空に設定します。
[mysqld] secure_file_priv=''
これにより、コマンドを使用してデータ ファイルをインポートおよびエクスポートできるようになります。
上記の例では、データはソース データベースの dc_mp_fans テーブルからターゲット データベースの wxa_fans テーブルに移行されます。 2 つのデータ テーブルのフィールドは次のとおりです: dc_mp_fans
wxa_fans
データをインポートするときに、対象フィールドのデータと一致するフィールド名を指定し、@dummy を通じて不要な対象フィールドのデータを破棄できます。
このデータ移行エクスペリエンスに基づく要約は次のとおりです。
以上がMysql の百万レベルのデータ移行プロセスの記録に焦点を当てます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。