コロナウイルスのために、私の会社は規模を縮小してコストを削減せざるを得ません。簡単に言えば、混乱を最小限に抑えながら、元のデータベースサーバー(2週間で完全にオフになる)をMASTERレプリケーターとして設定し、すべてのテーブルを読み取り用にロックし、データをダンプして34GBを生成しました。 sqlファイルとテーブルのロックを解除しました。その後、ファイルを他のサーバーにコピーし、次のコードを使用してmysql-clientを介してmysql importを実行しました
cat default-start-import.sql newdatabase.sql default-end-import.sql | mysql -uroot -p newdatabase
Default-start-import.sqlおよびdefault-end-import.sqlの内容は次のとおりです。
default-start-import.sql
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
default-end-import.sql
COMMIT;
SET autocommit=1;
SET unique_checks=1;
SET foreign_key_checks=1;
問題は、この34 GBのダンプが2日間実行されており、プロセスリストと私が持っているテーブルの量を見ると、約50%のインポートであると言えます。そして、おそらくこのスレーブサーバーは、現在何もしていません。アイドリングです。
MySQLのCPU使用率は最悪で9%で、メモリ使用率は最悪で44%です。クエリを見ると、行を挿入するのに約1〜2秒かかります。数百万行のテーブルがあります。各行に1秒かかる場合、このインポートは完了するまでに数年かかります。ハードドライブのスワッピングを減らすためにsysctlでvm.swappinessを10に設定し、サーバーは安定した2.4の負荷で実行されます。負担が大きいとは言えません。
スロークエリログを無効にしました
innodb_flush_method = O_DIRECT
を設定しました。innodbに20ギガバイトのバッファを与えました
プロセスをスピードアップするために他にできることはありますか?これは非常に多くの時間の無駄のように感じます。たった34 GBですが、すぐに数百ギガバイトのデータベースを持つスレーブサーバーを立ち上げる組織があると思います。ここでは、30 GBのデータベースで苦労しています。どうやって?!?
大規模なデータベースは論理的(SQLなどでエクスポートする)ではなく物理的(つまり、物理データベースファイルをコピーする)でバックアップする必要があります。 Oracle MySQL Community Editionを使用する場合は、 xtrabackup を使用する必要があります。 MariaDBを使用する場合、前のリリースに統合された機能 https://mariadb.com/kb/en/mariabackup/ があります。
My.cnf [mysqld]セクションで考慮すべき提案
performance_schema=0 # from ON to conserve CPU cycles
key_buffer_size=200M # from 2G to support 201M of MyISAM indexes
query_cache_size=0 # from 256M because query_cache_type = OFF conserve RAM
thread_concurrency=6 # from 16, you only have 4 cores/8 threads, leave 2 free
innodb_thread_concurrency=6 # to match thread_concurrency
innodb_lru_scan_depth=100 # from 1024 to conserve 90% of CPU cycles used for function every SECOND
innodb_log_file_size=1G # from 50M to support ~ 1 HR logging
innodb_log_buffer_size=500M # from 8M to support ~ 30 minutes in RAM
innodb_io_capacity=900 # from 200 to use more of IOPS capacity
innodb_change_buffer_max_size=50 # from 25 (percent) for higher INSERT rate per second
マイプロファイル、無料でダウンロードできるユーティリティスクリプトのネットワークプロファイル、および連絡先情報を表示します。毎日の使用でパフォーマンスを向上させる機会がさらにあります。