Linux
 Computer >> コンピューター >  >> システム >> Linux

MariaDB / MySQLデータベースの圧縮、デフラグ、最適化

この記事では、MySQL / MariaDBでのテーブル/データベースの圧縮と最適化のいくつかの方法について説明します。これは、データベースが配置されているディスクのスペースを節約するのに役立ちます。

大規模なプロジェクトのデータベースは時間とともに非常に大きくなり、それをどうするかという疑問が常に生じます。問題を解決する方法はいくつかあります。古い情報を削除したり、データベースを小さなデータベースに分割したり、サーバーのディスクサイズを増やしたり、テーブルを圧縮/縮小したりすることで、データベース内のデータ量を減らすことができます。

データベース機能のもう1つの重要な側面は、パフォーマンスを向上させるために、テーブルとデータベースを時々最適化する必要があることです。

InnoDBテーブルの圧縮と最適化

ibdata1およびib_logファイル

InnoDBを使用するほとんどのプロジェクト テーブルには大きなibdata1の問題があります およびib_log ファイル。ほとんどの場合、これは間違ったMySQL/MariaDB構成またはDBアーキテクチャに関連しています。 InnoDBテーブルのすべての情報は、ibdata1ファイルに保存されます。このファイルのスペースは、それ自体では再利用されません。テーブルデータを個別のibd*に保存することを好みます ファイル。これを行うには、次の行を my.cnfに追加します :

innodb_file_per_table

または

innodb_file_per_table=1

サーバーが構成されていて、InnoDBテーブルを備えた生産的なデータベースがある場合は、次の手順を実行します。

  1. サーバー上のすべてのデータベースをバックアップします(mysqlとperformance_schemaを除く)。次のコマンドを使用してデータベースダンプを取得できます。# mysqldump -u [username] –p[password] [database_name] > [dump_file.sql]
  2. データベースバックアップを作成したら、mysql/mariadbサーバーを停止します;
  3. my.cfgの設定を変更します;
  4. ibdata1を削除します およびib_log ファイル;
  5. mysql/mariadbデーモンを起動します;
  6. バックアップからすべてのデータベースを復元します:# mysql -u [username] –p[password] [database_name] < [dump_file.sql]

これを実行すると、すべてのInnoDBテーブルが個別のファイルに保存され、ibdata1の指数関数的成長が停止します。

InnoDBテーブル圧縮

テキスト/BLOBデータを使用してテーブルを圧縮し、かなりのディスク容量を節約できます。

圧縮される可能性のあるテーブルを含むinnodb_testデータベースがあるため、ディスク領域を解放できます。何かをする前に、すべてのデータベースをバックアップすることをお勧めします。 mysqlサーバーに接続します:

# mysql -u root -p

mysqlコンソールで必要なデータベースを選択します:

# use innodb_test;

MariaDB / MySQLデータベースの圧縮、デフラグ、最適化

テーブルとそのサイズのリストを表示するには、次のクエリを使用します。

SELECT table_name AS "Table",
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size in (MB)"
FROM information_schema.TABLES
WHERE table_schema = "innodb_test"
ORDER BY (data_length + index_length) DESC;

ここで、innodb_testはデータベースの名前です。

MariaDB / MySQLデータベースの圧縮、デフラグ、最適化

一部のテーブルは圧縮されている場合があります。 b_crm_event_relationsを見てみましょう 例として表。このクエリを実行します:

mysql> ALTER TABLE b_crm_event_relations ROW_FORMAT=COMPRESSED;

実行後、圧縮によりテーブルのサイズが26MBから11MBに減少したことがわかります。

MariaDB / MySQLデータベースの圧縮、デフラグ、最適化

テーブルを圧縮することで、ホストのディスク容量を大幅に節約できます。ただし、圧縮されたテーブルを操作する場合、CPUの負荷は大きくなります。 CPUリソースに問題はないが、ディスク容量に問題がある場合は、dbテーブルに圧縮を使用します。

MySQL/MariDBでのMyISAMテーブル圧縮

Myisamを圧縮するには テーブルでは、mysqlコンソールの代わりにサーバーコンソールで特別なクエリを使用します。テーブルを圧縮するには、次のコマンドを実行します。

# myisampack -b /var/lib/mysql/test/modx_session

ここで、/ var / lib / mysql / test/modx_sessionはテーブルへのパスです。残念ながら、大きなテーブルがなく、小さなテーブルを圧縮する必要がありましたが、結果は引き続き表示されました(ファイルは25MBから18MBに圧縮されました):

# du -sh modx_session.MYD

25M modx_session.MYD

# myisampack -b /var/lib/mysql/test/modx_session

Compressing /var/lib/mysql/test/modx_session.MYD: (4933 records)
- Calculating statistics
- Compressing file
29.84%
Remember to run myisamchk -rq on compressed tables

# du -sh modx_session.MYD

18M modx_session.MYD

-bを使用しました コマンドを入力します。追加すると、テーブルは圧縮前にバックアップされ、OLDラベルでマークされます:

# ls -la modx_session.OLD

-rw-r----- 1 mysql mysql 25550000 Dec 17 15:20 modx_session.OLD

# du -sh modx_session.OLD

25M modx_session.OLD

MariaDB / MySQLデータベースの圧縮、デフラグ、最適化

MySQLとMariaDBでのテーブルとデータベースの最適化

テーブルとデータベースを最適化するには、それらを最適化することをお勧めします。データベースに最適化が必要なテーブルがあるかどうかを確認してください。

MySQLコンソールを開き、データベースを選択して、次のクエリを実行します。

select table_name, round(data_length/1024/1024) as data_length_mb, round(data_free/1024/1024) as data_free_mb from information_schema.tables where round(data_free/1024/1024) > 50 order by data_free_mb;

したがって、少なくとも50MBの未使用スペースがあるすべてのテーブルを表示します。

+-------------------------------+----------------+--------------+
| TABLE_NAME | data_length_mb | data_free_mb |
+-------------------------------+----------------+--------------+
| b_disk_deleted_log_v2 | 402 | 64 |
| b_crm_timeline_bind | 827 | 150 |
| b_disk_object_path | 980 | 72 |

data_length_mb —テーブルの合計サイズ

data_free_mb —テーブル内の未使用スペース

これらは、最適化できるテーブルです。ディスク上でそれらが占めるスペースを確認してください:

# ls -lh /var/lib/mysql/innodb_test/ | grep b_

-rw-r----- 1 mysql mysql 402M Oct 17 12:12 b_disk_deleted_log_v2.MYD
-rw-r----- 1 mysql mysql 828M Oct 17 13:23 b_crm_timeline_bind.MYD
-rw-r----- 1 mysql mysql 981M Oct 17 11:54 b_disk_object_path.MYD

これらのテーブルを最適化するには、mysqlコンソールで次のコマンドを実行します。

# OPTIMIZE TABLE b_disk_deleted_log_v2, b_disk_object_path, b_crm_timeline_bind;

MariaDB / MySQLデータベースの圧縮、デフラグ、最適化

最適化が成功すると、次のような出力が表示されます。

+-------------------------------+----------------+--------------+
| TABLE_NAME | data_length_mb | data_free_mb |
+-------------------------------+----------------+--------------+
| b_disk_deleted_log_v2 | 74 | 0 |
| b_crm_timeline_bind | 115 | 0 |
| b_disk_object_path | 201 | 0 |

ご覧のとおり、data_free_mbは現在0に等しく、テーブルサイズは大幅に縮小されています(3〜4倍)。

mysqlcheckを使用して最適化を実行することもできます サーバーコンソールの場合:

# mysqlcheck -o innodb_test b_workflow_file -u root -p innodb_test.b_workflow_file

innodb_testの場所 あなたのデータベースです
そしてb_workflow_file テーブルの名前です
MariaDB / MySQLデータベースの圧縮、デフラグ、最適化

データベース内のすべてのテーブルを最適化するには、サーバーコンソールで次のコマンドを実行します。
# mysqlcheck -o innodb_test -u root -p

innodb_testはデータベース名です

または、サーバー上のすべてのデータベースの最適化を実行します。

# mysqlcheck -o --all-databases -u root -p

最適化の前後でデータベースのサイズを確認すると、合計サイズが減少していることがわかります。

# du -sh

2.5G

# mysqlcheck -o innodb_test -u root -p

innodb_test.b_admin_notify
note : Table does not support optimize, doing recreate + analyze instead
status : OK
innodb_test.b_admin_notify_lang
note : Table does not support optimize, doing recreate + analyze instead
status : OK
innodb_test.b_adv_banner
note : Table does not support optimize, doing recreate + analyze instead
status : OK

# du -sh

1.7G

したがって、サーバーのスペースを節約するために、MySQL/MariDBテーブルとデータベースを時々最適化および圧縮できます。最適化作業を行う前に、データベースをバックアップすることを忘れないでください。


  1. MariaDB:インストールとパフォーマンスの最適化

    この記事では、Linux CentOS 7でのデータベースサーバーMariaDBのインストール、基本構成、およびパフォーマンスの最適化について検討します。記事の最後に、MariaDB構成ファイルの例をいくつか示し、最適なものを選択できるようにします。データベースサーバーのパラメーター。 CentOSにMariaDBをインストールする 最近、MariaDBが標準のCentOS 7ベースリポジトリに追加されましたが、リポジトリ内のバージョンは5.5です。このバージョンは最新ではなく、パフォーマンスの問題があり、InnoDBで全文検索を提供していません。現在のバージョンのMaria

  2. データベース内のテーブルの数を表示するためのMySQLクエリとは何ですか?

    たとえば、ここではWEBデータベースを使用しています。データベースWEBでテーブルの数を見つける必要があります。これには、MySQLのINFORMATION_SCHEMA.TABLESを使用します。 以下は、テーブルの数を表示するためのクエリです- mysql> select count(table_name) as TotalNumberOfTablesInWebDatabase    -> from information_schema.tables    -> where table_schema='web';