Hi, ( hopefully a MySQL developer sees this at some point! )

I am giving InnoDB a good workout before rolling it out onto
production systems, and found a bug in the way the tablespace gets fragmented
when doing basic add/drop of indexes.  Below my sig is a series of SQL
commands I used to replicate the problem.

Basically, when doing a drop index, add index, drop index, one would
expect the tablespace to look more or less how it looked after the first
drop index since the add index should just reuse what gets reclaimed
during the 1st drop.  What I am finding however is that this sequence will
perpetually grow the tablespace, both on disk, and according to InnoDB.

The really interesting thing about this issue is that the tablespace
data file grows on disk at the "drop index" time, not during the "add index".
I could not believe it when I saw it at first, but I repeated the
procedure and confirmed this aspect of this bug a couple times.

Note that I am using the "autoextend" feature with a basic innodb config of:

# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /usr/local/mysql4/innodb
innodb_data_file_path = ibdata1:100M:autoextend
innodb_log_group_home_dir = /usr/local/mysql4/innodb
innodb_log_arch_dir = /usr/local/mysql4/innodb
transaction-isolation = READ-COMMITTED

and the innodb files end up looking like this:

]$ ls -allg /usr/local/mysql4/innodb/
total 504352
drwxr-xr-x    2 mysql        4096 Jun 21 00:50 .
drwxr-xr-x   12 root         4096 Jun 21 00:17 ..
-rw-rw----    1 mysql       25088 Mar 22 22:00 ib_arch_log_0000000000
-rw-rw----    1 mysql        2560 Jun 21 00:50 ib_arch_log_0000000002
-rw-rw----    1 mysql    499122176 Jul  1 19:45 ibdata1
-rw-rw----    1 mysql     8388608 Jul  1 19:45 ib_logfile0
-rw-rw----    1 mysql     8388608 Jul  1 19:45 ib_logfile1

and just before the last "drop index" the ibdata1 file looked like:

]$ ls -allg /usr/local/mysql4/innodb/
-rw-rw----    1 mysql    490733568 Jul  1 19:44 ibdata1

Finally, I call this a bug because it seems that if one is doing no more
than routine maintenance on tables by adding/dropping indexes, one will
eventually run out of disk space regardless of whether one is actually
using that disk space!

Also, I have a linux 2.4 kernel that this is running on, with mysql
compiled with gcc 3.2.2.

Thanks,

Josh
________________________________________________________________________
Josh Chamas, Founder    | NodeWorks - http://www.nodeworks.com
Chamas Enterprises Inc. | NodeWorks Directory - http://dir.nodeworks.com
http://www.chamas.com   | Apache::ASP - http://www.apache-asp.org


mysql> alter table clicks drop index idx_test; Query OK, 891450 rows affected (57.83 sec) Records: 891450 Duplicates: 0 Warnings: 0

mysql> show table status like 'clicks';
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
| Name   | Type   | Row_format | Rows   | Avg_row_length | Data_length | 
Max_data_length | Index_length | Data_free | Auto_increment | Create_time
| Update_time | Check_time | Create_options | Comment                |
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
| clicks | InnoDB | Dynamic    | 891651 |             95 |    85590016 |            
NULL |     58458112 |         0 |           NULL | NULL
| NULL        | NULL       |                | InnoDB free: 323584 kB |
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
1 row in set (0.00 sec)

mysql> alter table clicks add index idx_test (client_id);
Query OK, 891450 rows affected (1 min 4.73 sec)
Records: 891450  Duplicates: 0  Warnings: 0

mysql> show table status like 'clicks';
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
| Name   | Type   | Row_format | Rows   | Avg_row_length | Data_length | 
Max_data_length | Index_length | Data_free | Auto_increment | Create_time
| Update_time | Check_time | Create_options | Comment                |
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
| clicks | InnoDB | Dynamic    | 891651 |             95 |    85590016 |            
NULL |     91602944 |         0 |           NULL | NULL
| NULL        | NULL       |                | InnoDB free: 291840 kB |
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
1 row in set (0.01 sec)

mysql> alter table clicks drop index idx_test;
Query OK, 891450 rows affected (1 min 9.88 sec)
Records: 891450  Duplicates: 0  Warnings: 0

mysql> show table status like 'clicks';
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
| Name   | Type   | Row_format | Rows   | Avg_row_length | Data_length | 
Max_data_length | Index_length | Data_free | Auto_increment | Create_time
| Update_time | Check_time | Create_options | Comment                |
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
| clicks | InnoDB | Dynamic    | 891651 |             95 |    85590016 |            
NULL |     58458112 |         0 |           NULL | NULL
| NULL        | NULL       |                | InnoDB free: 331776 kB |
+--------+--------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------
+-------------+------------+----------------+------------------------+
1 row in set (0.01 sec)

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]



Reply via email to