MySQL MyISAM表引擎,会分别创建三个文件:表结构、表索引、表数据空间。可以直接把数据库目录移动到其他服务器运行的。
MySQL InnoDB表引擎,默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1。ibdata1文件不会自动收缩,备份也麻烦,一般使用mysqldump导出。



共享表结构和独立表结构对比(互联网分享)

1、共享表空间(默认)
优点:
可以放表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同步的文件上)。数据和文件放在一起方便管理。

缺点:
所有的数据和索引存放到一个文件中以为着将有一个很常大的文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。
我们知道共享表空间管理会出现表空间分配后不能回缩的问题,当出现临时建索引或是创建一个临时表的操作表空间扩大后,就是删除相关的表也没办法回缩 那部分空间了。我们存在磁盘监控时,也许就报警不断了,但实际上MySQL还可以运行良好。另外,当磁盘上占用较多时性能也不是太好。
这种情况处理只能是是建一个新的Slave从主库上Dump出来,然后在Dump到从库中,动作较大。
对于InnoDB Hot Backup备份的操作(或是直接冷备),每次需要CP的文件比较大。如果现在有180G的表空间,但实际数据只有50多G,那么我们将面对每次需要拷180G的数据。
这种方式也许mysqldump是一个好的处理方式了。

2、独立表空间(推荐)
优点:
(1)每个表都有自已独立的表空间。
(2)每个表的数据和索引都会存在自已的表空间中。
(3)可以实现单表在不同的数据库中移动。
(4)空间可以回收(除drop table操作处,表空不能自已回收)
  a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
  b) 对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。
  c) 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。

缺点:
单表增加过大,如超过100个G。

结论:
共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整一 下:innodb_open_files 。


实际遇到的问题
最近发现zabbix服务器ibdata1文件很大,高达12GB。
网上查阅了zabbix的数据库存储原理,发现zabbix库是使用的innodb引擎的共享表空间,innodb把数据和索引都放在ibdata1下,随着数据增长,ibdata1会越来越大。性能方面会有影响。
原来默认情况下innodb会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中ibdata1,而且增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。
所以决定将innodb的共享表空间改成独立表空间。



方法一(清空history等大表数据,然后备份数据库、修改参数、还原数据库)

1、查看是否开启了独立表空间,并且查看哪些表占用了空间

MariaDB [(none)]> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF   |
+-----------------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> select table_name, (data_length+index_length)/1024/1024 as total_mb, table_rows from information_schema.tables where table_schema='zabbix';
+----------------------------+---------------+------------+
| table_name                 | total_mb      | table_rows |
+----------------------------+---------------+------------+
| acknowledges               |    0.06250000 |          0 |
| actions                    |    0.04687500 |         14 |
| alerts                     |    5.67187500 |       8314 |
| application_discovery      |    0.04687500 |          0 |
| application_prototype      |    0.04687500 |          1 |
| application_template       |    2.37500000 |      13963 |
| applications               |    1.96875000 |      14024 |
| auditlog                   |   18.54687500 |     102648 |
| auditlog_details           |    0.42187500 |       1948 |
| autoreg_host               |    0.03125000 |          0 |
| conditions                 |    0.03125000 |         61 |
| config                     |    0.04687500 |          1 |
| corr_condition             |    0.03125000 |          0 |
| corr_condition_group       |    0.03125000 |          0 |
| corr_condition_tag         |    0.01562500 |          0 |
| corr_condition_tagpair     |    0.01562500 |          0 |
| corr_condition_tagvalue    |    0.01562500 |          0 |
| corr_operation             |    0.03125000 |          0 |
| correlation                |    0.04687500 |          0 |
| dbversion                  |    0.01562500 |          1 |
| dchecks                    |    0.03125000 |          1 |
| dhosts                     |    0.03125000 |          0 |
| drules                     |    0.04687500 |          1 |
| dservices                  |    0.04687500 |          0 |
| escalations                |    0.03125000 |        154 |
| event_recovery             |   14.10937500 |      15170 |
| event_tag                  |    0.03125000 |          0 |
| events                     |   41.09375000 |      48127 |
| expressions                |    0.03125000 |          6 |
| functions                  |   10.78125000 |      56183 |
| globalmacro                |    0.03125000 |          1 |
| globalvars                 |    0.01562500 |          0 |
| graph_discovery            |    0.03125000 |         88 |
| graph_theme                |    0.03125000 |          2 |
| graphs                     |    6.09375000 |      17348 |
| graphs_items               |   12.20312500 |      73151 |
| group_discovery            |    0.03125000 |          0 |
| group_prototype            |    0.06250000 |          7 |
| groups                     |    0.03125000 |         19 |
| history                    | 2138.18750000 |   20528213 |
| history_log                |    1.03125000 |         33 |
| history_str                |    1.45312500 |       4150 |
| history_text               |    1.03125000 |        718 |
| history_uint               | 3719.29687500 |   43986021 |
| host_discovery             |    0.04687500 |          2 |
| host_inventory             |    0.01562500 |          0 |
| hostmacro                  |    0.03125000 |          0 |
| hosts                      |    0.48437500 |        707 |
| hosts_groups               |    0.15625000 |        806 |
| hosts_templates            |    0.15625000 |        777 |
| housekeeper                |    0.01562500 |        204 |
| httpstep                   |    0.03125000 |          3 |
| httpstepitem               |    0.04687500 |          9 |
| httptest                   |    0.07812500 |          3 |
| httptestitem               |    0.04687500 |          9 |
| icon_map                   |    0.04687500 |          0 |
| icon_mapping               |    0.04687500 |          0 |
| ids                        |    0.01562500 |         43 |
| images                     |    1.53125000 |        232 |
| interface                  |    0.18750000 |        924 |
| interface_discovery        |    0.03125000 |          0 |
| item_application_prototype |    0.04687500 |          1 |
| item_condition             |    0.21875000 |       1399 |
| item_discovery             |    0.75000000 |       5326 |
| items                      |   47.15625000 |     105674 |
| items_applications         |   17.21875000 |     119577 |
| maintenances               |    0.04687500 |          0 |
| maintenances_groups        |    0.04687500 |          0 |
| maintenances_hosts         |    0.04687500 |          0 |
| maintenances_windows       |    0.04687500 |          0 |
| mappings                   |    0.03125000 |        143 |
| media                      |    0.04687500 |         15 |
| media_type                 |    0.03125000 |          6 |
| opcommand                  |    0.03125000 |          4 |
| opcommand_grp              |    0.04687500 |          0 |
| opcommand_hst              |    0.04687500 |          4 |
| opconditions               |    0.03125000 |          0 |
| operations                 |    0.03125000 |         29 |
| opgroup                    |    0.04687500 |          1 |
| opinventory                |    0.01562500 |          0 |
| opmessage                  |    0.03125000 |         23 |
| opmessage_grp              |    0.04687500 |          5 |
| opmessage_usr              |    0.04687500 |         15 |
| optemplate                 |    0.04687500 |          1 |
| problem                    |    5.45312500 |      20859 |
| problem_tag                |    0.04687500 |          0 |
| profiles                   |    0.35937500 |       1626 |
| proxy_autoreg_host         |    0.03125000 |          0 |
| proxy_dhistory             |    0.03125000 |          0 |
| proxy_history              |    0.03125000 |          0 |
| regexps                    |    0.03125000 |          5 |
| rights                     |    0.04687500 |         19 |
| screen_user                |    0.04687500 |          0 |
| screen_usrgrp              |    0.04687500 |          0 |
| screens                    |    0.04687500 |         14 |
| screens_items              |    0.03125000 |         51 |
| scripts                    |    0.06250000 |          3 |
| service_alarms             |    0.04687500 |          0 |
| services                   |    0.03125000 |          0 |
| services_links             |    0.04687500 |          0 |
| services_times             |    0.03125000 |          0 |
| sessions                   |    2.01562500 |       6514 |
| slides                     |    0.04687500 |          1 |
| slideshow_user             |    0.04687500 |          0 |
| slideshow_usrgrp           |    0.04687500 |          0 |
| slideshows                 |    0.04687500 |          1 |
| sysmap_element_url         |    0.03125000 |          0 |
| sysmap_url                 |    0.03125000 |          0 |
| sysmap_user                |    0.04687500 |          0 |
| sysmap_usrgrp              |    0.04687500 |          0 |
| sysmaps                    |    0.07812500 |          1 |
| sysmaps_elements           |    0.09375000 |          1 |
| sysmaps_link_triggers      |    0.04687500 |          0 |
| sysmaps_links              |    0.06250000 |          0 |
| task                       |    0.01562500 |          0 |
| task_close_problem         |    0.01562500 |          0 |
| timeperiods                |    0.01562500 |          0 |
| trends                     |   73.68750000 |     822417 |
| trends_uint                |   36.59375000 |     496174 |
| trigger_depends            |    0.04687500 |         65 |
| trigger_discovery          |    0.03125000 |        106 |
| trigger_tag                |    0.03125000 |          0 |
| triggers                   |   18.31250000 |      46005 |
| users                      |    0.03125000 |         10 |
| users_groups               |    0.04687500 |         11 |
| usrgrp                     |    0.03125000 |         12 |
| valuemaps                  |    0.03125000 |         17 |
+----------------------------+---------------+------------+
127 rows in set (12.41 sec)


history(2052万行,2.1GB)、history_unit(4300万行,3.7G)
trends(73万行)、trends_uint(36万行)

由于数据量太大,按照普通的方式delete数据的话基本上不太可能。决定直接采用truncate table的方式来快速清空这些表的数据,再使用mysqldump导出数据,删除共享表空间数据文件,重新导入数据。

2、停止相关服务,避免改造时写入数据

[root@localhost ~]# systemctl stop zabbix-server
[root@localhost ~]# systemctl stop httpd



3、清空历史数据
mysql > use zabbix;
mysql > truncate table history;
mysql > optimize table history;
mysql > truncate table history_uint;
mysql > optimize table history_uint;
mysql > truncate table trends;
mysql > optimize table trends;
mysql > truncate table trends_uint;
mysql > optimize table trends_uint;

MariaDB [(none)]> use zabbix;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [zabbix]> truncate table history;
Query OK, 0 rows affected (0.60 sec)
MariaDB [zabbix]> optimize table history;
+----------------+----------+----------+-------------------------------------------------------------------+
| Table          | Op       | Msg_type | Msg_text                                                          |
+----------------+----------+----------+-------------------------------------------------------------------+
| zabbix.history | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| zabbix.history | optimize | status   | OK                                                                |
+----------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.33 sec)
MariaDB [zabbix]> truncate table history_uint;
Query OK, 0 rows affected (0.15 sec)               
MariaDB [zabbix]> optimize table history_uint;
+---------------------+----------+----------+-------------------------------------------------------------------+
| Table               | Op       | Msg_type | Msg_text                                                          |
+---------------------+----------+----------+-------------------------------------------------------------------+
| zabbix.history_uint | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| zabbix.history_uint | optimize | status   | OK                                                                |
+---------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.15 sec)
MariaDB [zabbix]> truncate table trends;
Query OK, 0 rows affected (0.02 sec)               
MariaDB [zabbix]> optimize table trends;
+---------------+----------+----------+-------------------------------------------------------------------+
| Table         | Op       | Msg_type | Msg_text                                                          |
+---------------+----------+----------+-------------------------------------------------------------------+
| zabbix.trends | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| zabbix.trends | optimize | status   | OK                                                                |
+---------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.01 sec)
MariaDB [zabbix]> truncate table trends_uint;
Query OK, 0 rows affected (0.01 sec)               
MariaDB [zabbix]> optimize table trends_uint; 
+--------------------+----------+----------+-------------------------------------------------------------------+
| Table              | Op       | Msg_type | Msg_text                                                          |
+--------------------+----------+----------+-------------------------------------------------------------------+
| zabbix.trends_uint | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| zabbix.trends_uint | optimize | status   | OK                                                                |
+--------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.02 sec)


4、备份数据

[root@localhost ~]# mysqldump -u root -p --databases zabbix |gzip>201803211714.sql.gz


5、停止数据库

[root@localhost mysql]# systemctl stop mariadb.service


6、删除共享表空间数据文件

[root@localhost ~]# cd /var/lib/mysql/
[root@localhost mysql]# rm -rf ibdata1 ib_logfile0 ib_logfile1


7、增加innodb_file_per_table独立表空间参数

[root@localhost mysql]# vi /etc/my.cnf
# vi /etc/my.cnf
在[mysqld]下添加一行
innodb_file_per_table=1


8、启动MySQL

[root@localhost mysql]# systemctl start mariadb.service


9、查看参数是否生效

MariaDB [(none)]> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)


10、重新导入数据和确认

[root@localhost ~]# gunzip 201803211714.sql.gz
[root@localhost ~]# mysql -uroot -p zabbix <201803211714.sql

数据库目录innodb表应该有.ibd各自的文件


备注:另外推荐使用独立表空间的原因
从性能上对比共享表空间和独立表空间:
共享表空间在Insert操作有优势。其它都没独立表空间表现好。这里也有一个TIPS当启用独立表空间时,请合理调整一下:innodb_open_files 。
从Linux系统处理上出发:
所以对于大量更新操作的系统不太适合用共享表空间



方法二(先备份数据库、修改参数、删除ibdata1等文件、还原数据库)---没试过,因为我不想要历史数据。
1.查看是否开启

mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF    |
+-----------------------+---


2、编辑my.cnf配置文件[mysqld]加入下面这些行
innodb_file_per_table = 1


3、备份数据库

[root@localhost ~]# mysqldump -u root -p --databases zabbix |gzip>201803211702.sql.gz


4、停止数据库

[root@localhost ~]# mysqladmin --host=localhost --user=root --password shutdown


5、删除相关文件
ibdata1
ib_logfile*


6、启动mysql服务

[root@localhost ~]# systemctl start mariadb.service


7、还原数据

[root@localhost ~]# systemctl stop zabbix-server
[root@localhost ~]# gunzip 201803211702.sql.gz
[root@localhost ~]# mysql -uroot -p zabbix <20180309.sql


8、验证独享空间是否开启

mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+---