mysql サイズの大きいテーブル削除方法

HACK

背景

  • DBサーバの空き容量を確保するために、サイズが大きく不要なDBテーブルのdropは必要となってくる
    • 例えば、数年分のデータの移行が終了した後、データの削除等
  • DBテーブルのサイズが大きいため、単純にDROPしたら、IOが詰まる。
  • 上記問題を解決するために、下記手順に従い削除作業をするとつまらない

二つのパターン

  • パターン1:まったく同じの空テーブルの用意が必要
    • データの中身が不要だが、アクセスするモジュールが存在する限り、用意したほうがいいと思われる。

#MySQLに入り、該当テーブルの定義を調べる$ /usr/local/mysql/bin/mysqlmysql> SHOW CREATE TABLE comp_event.t_hoge \G;*************************** 1. row ***************************Table: t_hogeCreate Table: CREATE TABLE `t_hoge` (`id` int(11) NOT NULL auto_increment,`value` int(11) default NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin11 row in set (0.00 sec)
#同じの空テーブルを定義mysql> Create Table: CREATE TABLE `t_hoge_blank` (-> `id` int(11) NOT NULL auto_increment,-> `value` int(11) default NULL,-> PRIMARY KEY (`id`)-> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ステップ2:テーブルをSWAP(master)
#MySQLに入り、テーブルを入れ替える(※アトミック性を保つように)$ /usr/local/mysql/bin/mysqlmysql> RENAME TABLE t_hoge TO t_hoge_bk, t_hoge_blank TO t_hoge;

ステップ3:hardlinkを作成(master/slave)
master/slave両方実施
InnoDBテーブル
#innodb_data_home_dirを確認$ cat /etc/my.cnf |grep innodb_data_home_dirinnodb_data_home_dir = /home/mysql
#frmファイルとibdファイルを確認$ sudo ls -l&nbsp;<innodb_data_home_dir>/comp_event/ |grep&nbsp;t_hoge_bk-rw-rw---- 1 mysql mysql 8911 Sep 7 14:06&nbsp;t_hoge_bk.frm-rw-rw---- 1 mysql mysql 180224 Sep 7 14:13&nbsp;t_hoge_bk.ibd
#ibdファイルのhardlinkを作成$ ln&nbsp;<innodb_data_home_dir>/comp_event/t_hoge_bk.ibd /tmp/t_hoge_hl
#hardlinkを確認$ ls -l&nbsp;<innodb_data_home_dir>/comp_event/t_hoge_bk.ibd &amp;&amp; ls -l /tmp/t_hoge_hl

MyISAMテーブル
#data_dirを確認$ cat /etc/my.cnf |grep datadirdata_dir = /home/mysql
#frmファイルとMYI・MYDファイルを確認$ sudo ls -l&nbsp;<data_dir>/comp_event/ |grep&nbsp;t_hoge_bk-rw-rw---- 1 mysql mysql 8911 Sep 7 14:06&nbsp;t_hoge_bk.frm-rw-rw---- 1 mysql mysql 8024 Sep 7 14:13&nbsp;t_hoge_bk.MYI-rw-rw---- 1 mysql mysql 180224849 Sep 7 14:13&nbsp;t_hoge_bk.MYD
#ibdファイルのhardlinkを作成$ ln&nbsp;<data_dir>/comp_event/t_hoge_bk.ibd /tmp/t_hoge_hl
#hardlinkを確認$ ls -l&nbsp;<data_dir>/comp_event/t_hoge_bk.ibd &amp;&amp; ls -l /tmp/t_hoge_hl

ステップ4:テーブルのDROP(master)
#MySQLに入り、該当テーブルをDROP$ /usr/local/mysql/bin/mysqlmysql&gt; DROP TABLE IF EXISTS&nbsp;comp_event.t_hoge_bk;
#データファイルを確認$ sudo ls -l&nbsp;<data_dir or innodb_data_home_dir="">/comp_event/ |grep&nbsp;t_hoge_bk#何もないことを確認

ステップ5:データファイルのionice削除(master/slave)
master/slave両方実施
#MySQLに入り、該当テーブルをDROP
$ ionice -c3 rm /tmp/t_hoge_hl</data_dir></data_dir></data_dir></data_dir></innodb_data_home_dir></innodb_data_home_dir></innodb_data_home_dir>

・パターン2の対応(空テーブルの用意が不要)

event1クラスターのcomp_eventデータベースのt_hogeというテーブルを例とする。
ステップ1:hardlinkの作成(master/slave)
master/slave両方実施

InnoDBテーブル
#innodb_data_home_dirを確認$ cat /etc/my.cnf |grep innodb_data_home_dirinnodb_data_home_dir = /home/mysql
#frmファイルとibdファイルを確認$&nbsp;sudo ls -l&nbsp;<innodb_data_home_dir>/comp_event/ |grep&nbsp;t_hoge-rw-rw---- 1 mysql mysql 8911 Sep 7 14:06&nbsp;t_hoge.frm-rw-rw---- 1 mysql mysql 180224 Sep 7 14:13&nbsp;t_hoge.ibd
#ibdファイルのhardlinkを作成$ ln&nbsp;<innodb_data_home_dir>/comp_event/t_hoge.ibd /tmp/t_hoge_hl
#hardlinkを確認$ ls -l&nbsp;<innodb_data_home_dir>/comp_event/t_hoge.ibd &amp;&amp; ls -l /tmp/t_hoge_hl

MyISAMテーブル
#innodb_data_home_dirを確認$ cat /etc/my.cnf |grep datadirdata_dir = /home/mysql
#frmファイルとibdファイルを確認$ sudo ls -l&nbsp;<data_dir>/comp_event/ |grep&nbsp;t_hoge-rw-rw---- 1 mysql mysql 8911 Sep 7 14:06&nbsp;t_hoge.frm-rw-rw---- 1 mysql mysql 8024 Sep 7 14:13&nbsp;t_hoge.MYI-rw-rw---- 1 mysql mysql 180224849 Sep 7 14:13&nbsp;t_hoge.MYD
#ibdファイルのhardlinkを作成$ ln&nbsp;<data_dir>/comp_event/t_hoge.MYD&nbsp;/tmp/t_hoge_hl
#hardlinkを確認$ ls -l&nbsp;<data_dir>/comp_event/t_hoge.MYD&nbsp;&amp;&amp; ls -l /tmp/t_hoge_hl

ステップ2:テーブルのDROP(master)
#MySQLに入り、該当テーブルをDROP$&nbsp;/usr/local/mysql/bin/mysqlmysql&gt; DROP TABLE IF EXISTS&nbsp;comp_event.t_hoge;
#データファイルを確認$ sudo ls -l&nbsp;<data_dir or innodb_data_home_dir="">/comp_event/ |grep&nbsp;t_hoge
#何もないことを確認

ステップ3:データファイルのionice削除(master/slave)
master/slave両方実施
不要なアラートを減らすため、該当サーバの監視を一時的に外す。
#MySQLに入り、該当テーブルをDROP$ ionice -c3 rm&nbsp;/tmp/t_hoge_hl</data_dir></data_dir></data_dir></data_dir></innodb_data_home_dir></innodb_data_home_dir></innodb_data_home_dir>

HACKmysql
スポンサーリンク
Harieshokuninをフォローする
できるだけ楽するハック

コメント

タイトルとURLをコピーしました