ホームページ  >  記事  >  データベース  >  Mysql の百万レベルのデータ移行プロセスの記録に焦点を当てます。

Mysql の百万レベルのデータ移行プロセスの記録に焦点を当てます。

藏色散人
藏色散人転載
2021-12-20 11:02:582110ブラウズ

このようなシナリオがあると仮定して、小さなプログラムを開発し、ダブル イレブン イベントの人気を利用して、1 か月であっという間に 100 万人以上のユーザーを獲得しました。小さなプログラム ページで、ポイントは WeChat ユーザーにテンプレート メッセージ通知を送信するために使用されます。

データ量が増えてきて、以前使用していたサーバーの容量が少し足りなくなってきました。最近、小さなプログラムのバックエンド開発に特化した新しいフレームワークを書いたので、元のデータを移行したいと考えています新しいシステムのデータベースに移行します。 4コア8Gマシンを購入し、データ移行を始めました。移行プロセスの簡単な記録を作成してみましょう。

Mysql の百万レベルのデータ移行プロセスの記録に焦点を当てます。

計画の選択

mysqldump 移行

通常の開発では、使用されるデータのバックアップおよび移行方法は、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セキュリティ項目の設定

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

Mysql の百万レベルのデータ移行プロセスの記録に焦点を当てます。

wxa_fans

Mysql の百万レベルのデータ移行プロセスの記録に焦点を当てます。

データをインポートするときに、対象フィールドのデータと一致するフィールド名を指定し、@dummy を通じて不要な対象フィールドのデータを破棄できます。

概要

このデータ移行エクスペリエンスに基づく要約は次のとおりです。

  • 少量のデータは、 mysqldumpコマンド この方法は簡単で便利です。
  • データの量が多く、移行に十分な忍耐力がある場合は、独自のスクリプトを作成し、適切な並列ソリューションを選択してデータを移行することもできます。この方法では、コーディング コストが高くなります。
  • データの量が多く、データの移行を短時間で完了したい場合は、mysql インポート ファイルとエクスポート ファイルを使用してデータを移行する方が効率的です。

#

以上がMysql の百万レベルのデータ移行プロセスの記録に焦点を当てます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。