web-dev-qa-db-ja.com

MySQLのリストアダンプは完了するのに時間がかかりすぎます。DBAはどのようにして大規模なデータベースを処理または複製しますか?

コロナウイルスのために、私の会社は規模を縮小してコストを削減せざるを得ません。簡単に言えば、混乱を最小限に抑えながら、元のデータベースサーバー(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のデータベースで苦労しています。どうやって?!?

1
Sk1ppeR

大規模なデータベースは論理的(SQLなどでエクスポートする)ではなく物理的(つまり、物理データベースファイルをコピーする)でバックアップする必要があります。 Oracle MySQL Community Editionを使用する場合は、 xtrabackup を使用する必要があります。 MariaDBを使用する場合、前のリリースに統合された機能 https://mariadb.com/kb/en/mariabackup/ があります。

2
pifor

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

マイプロファイル、無料でダウンロードできるユーティリティスクリプトのネットワークプロファイル、および連絡先情報を表示します。毎日の使用でパフォーマンスを向上させる機会がさらにあります。

1
Wilson Hauck