ホームページ データベース mysql チュートリアル mysql在线无性能影响删除7G大表_MySQL

mysql在线无性能影响删除7G大表_MySQL

Jun 01, 2016 pm 01:35 PM
mysql オンライン どうやって データベース サーバ

bitsCN.com

mysql在线无性能影响删除7G大表

 

如何在mysql数据库里删除7G(或更大)大表,使其又不影响服务器的io,导致性能下降影响业务。先不说其是mysql表,就是普通文件,如果直接rm删除,也会使服务器的io性能急剧下降;换个思路如果用化整为零的方式,分多次大大文件一点一点删除,就可以避免因删除文件占用太多服务器io资源

例子: www.bitsCN.com  

版本:

mysql> select version();

+------------+

| version()  |

+------------+

| 5.1.67-log |

+------------+

1 row in set (0.05 sec)

数据表大小:  www.bitsCN.com  

mysql> select count(1) from user4;

+----------+

| count(1) |

+----------+

| 36700160 |

+----------+

1 row in set (1 min 35.66 sec)

[root@racdb2 test]# ll user_bak*

-rw-rw---- 1 mysql dba      10466 Mar  1 13:50 user4_bak.frm

-rw-rw---- 2 mysql dba 7734296576 Mar  1 14:28 user4_bak.ibd

[root@racdb2 test]#

创建一个中间表,来见减少对业务影响

mysql> create table user4_tmp engine=innodb select * from user4 where 1=2;

Query OK, 0 rows affected (0.18 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| a              |

| b              |

| user           |

| user1          |

| user2          |

| user3          |

| user4          |

| user4_tmp      |

| utf8           |

+----------------+

9 rows in set (0.01 sec)

 

把原始表user4重命名

mysql> rename table user4 to user4_bak;

Query OK, 0 rows affected (0.03 sec)

把中间表重命名为原始表user4,如果需要数据,可以导入部分数据

mysql> rename table user4_tmp to user4;

Query OK, 0 rows affected (0.01 sec)

通过文件的硬链接方式删除文件

[root@racdb2 test]# ln user4_bak.ibd user4_bak.ibd.hdlk

[root@racdb2 test]# ll user_bak*

-rw-rw---- 1 mysql dba      10466 Mar  1 13:50 user4_bak.frm

-rw-rw---- 2 mysql dba 7734296576 Mar  1 14:28 user4_bak.ibd

-rw-rw---- 2 mysql dba 7734296576 Mar  1 14:28 user4_bak.ibd.hdlk

[root@racdb2 test]#

注意:

硬连接的作用是允许一个文件拥有多个有效路径名,即文件的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及文件的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

发现删除7G的文件巨快

mysql> drop table user4_bak;

Query OK, 0 rows affected (0.60 sec)

这个时候在mysql数据库里已经删除了表user4_bak,但系统的存储空间还没有释放,如下所示:

[root@racdb2 test]# ll user_bak*

-rw-rw---- 2 mysql dba 7734296576 Mar  1 14:28 user4_bak.ibd.hdlk

 

只有我们把文件user4_bak.ibd.hdlk删除,磁盘空间才会被释放,那如何尽量少占用系统资源,最小化影响业务来释放这个空间呢?前面已经分析通过化整为零的方式,通过coreutils工具集中的truncate对大文件进行shrink来逐渐释放空间.

 

脚本如下:

[root@racdb2 test]# more /home/mysql/rm_bigfile.sh

#!/bin/bash

#author:skate

#time:2013/02/28

#function:rm huge file

TRUNCATE=/usr/local/bin/truncate

for i in `seq 7384 -100 10 `; #从7384开始每次递减100 ,输出结果见下面

do 

  sleep 1

  echo "$TRUNCATE -s ${i}M /tmp/user4_bak.ibd.hdlk "

  $TRUNCATE -s ${i}M /mysqldata/data/test/user_bak.ibd.hdlk

done

 

执行脚本,然后同时开另一个session,用iostat查看系统io的压力

[root@racdb2 test]# sh /home/mysql/rm_bigfile.sh

发现每1s删除100M的文件,服务器基本没有压力

[root@racdb2 coreutils-8.9]# iostat -mx 2 | grep "sda2"

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00    10.45  0.00  1.00     0.00     0.04    92.00     0.00    0.50   0.50   0.05

sda2              0.00     2.99  0.00  9.95     0.00     0.05    10.40     0.03    3.20   0.25   0.25

sda2              0.00     9.50  0.00  1.00     0.00     0.04    84.00     0.00    1.50   1.50   0.15

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     9.50  0.00  1.00     0.00     0.04    84.00     0.00    0.50   0.50   0.05

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00    14.50  0.00  1.00     0.00     0.06   124.00     0.00    0.50   0.50   0.05

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     9.00  0.00  1.00     0.00     0.04    80.00     0.00    0.50   0.50   0.05

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     9.50  0.00  1.00     0.00     0.04    84.00     0.00    0.50   0.50   0.05

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     9.00  0.00  1.00     0.00     0.04    80.00     0.00    0.50   0.50   0.05

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00    10.55  0.50 10.05     0.00     0.08    16.00     0.04    3.95   1.43   1.51

sda2              0.00     0.00  2.01  0.00     0.01     0.00     8.00     0.02    8.00   8.00   1.61

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     7.54  0.00  1.01     0.00     0.03    68.00     0.00    0.50   0.50   0.05

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     9.50  0.00  1.00     0.00     0.04    84.00     0.00    0.50   0.50   0.05

sda2              0.00     2.99  0.00  1.00     0.00     0.02    32.00     0.00    0.50   0.50   0.05

sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

sda2              0.00     3.02  0.50  1.01     0.00     0.02    24.00     0.02   11.33  11.33   1.71

coreutils的安装

[root@racdb2 test]#wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.9.tar.gz

[root@racdb2 test]#tar -zxvf coreutils-8.9.tar.gz 

[root@racdb2 test]#cd coreutils-8.9

[root@racdb2 test]#./configure

[root@racdb2 test]#make && make install

总结:

1.使用方法:硬链接和化整为零

2.做事之前先思考方法,不要急于动手

3.多角度思考问题,本来是在线问题,在线解决起来,束缚较多,那就把在线变离线;一次删除影响大,那就变多次删除

 

---end----

bitsCN.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? Jun 03, 2024 pm 08:11 PM

MySQL クエリのパフォーマンスは、検索時間を線形の複雑さから対数の複雑さまで短縮するインデックスを構築することで最適化できます。 PreparedStatement を使用して SQL インジェクションを防止し、クエリのパフォーマンスを向上させます。クエリ結果を制限し、サーバーによって処理されるデータ量を削減します。適切な結合タイプの使用、インデックスの作成、サブクエリの使用の検討など、結合クエリを最適化します。クエリを分析してボトルネックを特定し、キャッシュを使用してデータベースの負荷を軽減し、オーバーヘッドを最小限に抑えます。

PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? Jun 03, 2024 pm 12:19 PM

PHP で MySQL データベースをバックアップおよび復元するには、次の手順を実行します。 データベースをバックアップします。 mysqldump コマンドを使用して、データベースを SQL ファイルにダンプします。データベースの復元: mysql コマンドを使用して、SQL ファイルからデータベースを復元します。

PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? Jun 02, 2024 pm 02:26 PM

MySQLテーブルにデータを挿入するにはどうすればよいですか?データベースに接続する: mysqli を使用してデータベースへの接続を確立します。 SQL クエリを準備します。挿入する列と値を指定する INSERT ステートメントを作成します。クエリの実行: query() メソッドを使用して挿入クエリを実行します。成功すると、確認メッセージが出力されます。

MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 Dec 09, 2024 am 11:42 AM

MySQL 8.4 (2024 年時点の最新の LTS リリース) で導入された主な変更の 1 つは、「MySQL Native Password」プラグインがデフォルトで有効ではなくなったことです。さらに、MySQL 9.0 ではこのプラグインが完全に削除されています。 この変更は PHP および他のアプリに影響します

PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? Jun 02, 2024 pm 02:13 PM

PHP で MySQL ストアド プロシージャを使用するには: PDO または MySQLi 拡張機能を使用して、MySQL データベースに接続します。ストアド プロシージャを呼び出すステートメントを準備します。ストアド プロシージャを実行します。結果セットを処理します (ストアド プロシージャが結果を返す場合)。データベース接続を閉じます。

PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? Jun 04, 2024 pm 01:57 PM

PHP を使用して MySQL テーブルを作成するには、次の手順が必要です。 データベースに接続します。データベースが存在しない場合は作成します。データベースを選択します。テーブルを作成します。クエリを実行します。接続を閉じます。

PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル Jun 04, 2024 pm 01:42 PM

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます Jul 18, 2024 am 05:48 AM

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

See all articles