MySQL共享表空間擴容

一.什麼是共享表空間和獨佔表空間mysql

共享表空間以及獨佔表空間都是針對數據的存儲方式而言的。sql

共享表空間: 某一個數據庫的全部的表數據,索引文件所有放在一個文件中,默認這個共享表空間的文件路徑在data目錄下。 默認的文件名爲:ibdata1 初始化爲10M。數據庫

獨佔表空間: 每個表都將會生成以獨立的文件方式來進行存儲,每個表都有一個.frm表描述文件,還有一個.ibd文件。 其中這個文件包括了單獨一個表的數據內容以及索引內容,默認狀況下它的存儲位置也是在表的位置之中。併發

二者之間的優缺點app

共享表空間:高併發

優勢:性能

能夠將表空間分紅多個文件存放到各個磁盤上。數據和文件放在一塊兒方便管理。ui

缺點:atom

全部的數據和索引存放到一個文件中覺得着將有一個很常大的文件,雖然能夠把一個大文件分紅多個小文件,可是多個表及索引在表空間中混合存儲,這樣對於一個表作了大量刪除操做後表空間中將會有大量的空隙,特別是對於統計分析,日值系統這類應用最不適合用共享表空間。spa

獨立表空間:在配置文件(my.cnf)中設置: innodb_file_per_table

優勢:

1.每一個表都有自已獨立的表空間。

2.每一個表的數據和索引都會存在本身的表空間中。

3.能夠實現單表在不一樣的數據庫中移動。

4.空間能夠回收

a) Drop table操做自動回收表空間,若是對於統計分析或是日值表,刪除大量數據後能夠經過:alter table TableName engine=innodb;回縮不用的空間。

b) 對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。

c) 對於使用獨立表空間的表,無論怎麼刪除,表空間的碎片不會太嚴重的影響性能,並且還有機會處理。

缺點:

單表增長過大,如超過100個G

二.共享表空間存放什麼東西

當你啓用了 innodb_file_per_table,表被存儲在他們本身的表空間裏,可是共享表空間仍然在存儲其它的 InnoDB 內部數據:

(1)數據字典,也就是 InnoDB 表的元數據

(2)change緩衝區

(3)雙寫緩衝區

(4)回滾段

(5)undo空間

(6)外鍵約束系統表

所以,咱們在初始化ibdata1時,最好設置大一些,這樣就能夠避免由於在高併發情景下致使ibdata1急劇增大,大大影響性能。

三.什麼緣由引發ibdata1大小迅速增長

(1)出現Bug

(2)清除事務的速度跟不上,主要是磁盤IO

(3)大事務undo,即便kill了,空間也不能回收

主要從以下方面改進:

(1)併發purge線程夠不

(2)磁盤IO

(3)不要用32位系統

(4)儘可能減小大事務執行,將大事務進行分拆多個小事務執行

當設置innodb_file_per_table=1啓用獨立表空間後,ibdata1變很大,常見的緣由都是有大活動事務執行好久沒有完成或是存在回滾空間中的未清除事務數。

能夠在show engine innodb status的TRANSACTIONS部分查看正在執行的活動事務或History list length值來確認緣由。

四.如何給共享表空間擴容

場景一:在同一磁盤中給共享表空間的ibdata1擴容操做:

檢查my.cnf文件配置的ibdata1大小初始值爲1000M,自動增加,以下:

innodb_data_home_dir=/apps/dbdat/mariadb10_data3306

innodb_data_file_path=ibdata1:1000M:autoextend

檢查數據文件目錄中ibdata1實際文件大小爲1786773504,以下:

-rw-r--r-- 1 apps apps 1786773504 Jul 27 21:29 ibdata1

這裏擴容有兩個注意的地方:

1.若ibdata1的實際大小沒有超過1000M,那麼擴容的配置文件中直接寫1000M;
2.若ibdata1的實際大小超過了1000M,則擴容的配置文件中寫實際的精確大小值,如上面這個場景的操做:
(product)root@localhost [(none)]> select 1786773504/1024/1024;
+----------------------+
| 1786773504/1024/1024 |
+----------------------+
|        1704.00000000 |
+----------------------+
1 row in set (0.00 sec)

更改my.cnf配置,增長一個ibdata2,以下

innodb_data_file_path=ibdata1:1704M;ibdata2:1000M:autoextend  ------這裏注意格式,分號和冒號

重啓mysql後,檢查新增的ibdata2是否生效,下面表示已有生效。

[apps@mvxl0782 mariadb10_data3306]$ ls -l|grep ibd

-rw-r--r-- 1 apps apps 1786773504 Jul 31 18:44 ibdata1

-rw-rw---- 1 apps apps 1048576000 Jul 31 18:44 ibdata2

場景二:在不一樣磁盤中給共享表空間的ibdata1擴容操做:

根據場景一中擴容的兩點注意,更改my.cnf配置,在不一樣磁盤中增長一個ibdata3,以下

innodb_data_file_path=ibdata1:1704M;ibdata2:1000M;/apps2/dbdat/ibdata3:100M:autoextend

重啓mysql時,報下面錯:

160731 18:53:29 mysqld_safe mysqld from pid file /apps/dbdat/mariadb10_data3306/mysql.pid ended
160731 18:53:38 mysqld_safe Starting mysqld daemon with databases from /apps/dbdat/mariadb10_data3306
160731 18:53:38 [Note] /apps/svr/mariadb10/bin/mysqld (mysqld 10.0.20-MariaDB-log) starting as process 15681 ...
2016-07-31 18:53:38 7f83161d9760 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in
future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.
160731 18:53:38 [Note] InnoDB: Using mutexes to ref count buffer pool pages
160731 18:53:38 [Note] InnoDB: The InnoDB memory heap is disabled
160731 18:53:38 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
160731 18:53:38 [Note] InnoDB: Memory barrier is not used
160731 18:53:38 [Note] InnoDB: Compressed tables use zlib 1.2.3
160731 18:53:38 [Note] InnoDB: Using Linux native AIO
160731 18:53:38 [Note] InnoDB: Using CPU crc32 instructions
160731 18:53:38 [Note] InnoDB: Initializing buffer pool, size = 21.0G
160731 18:53:39 [Note] InnoDB: Completed initialization of buffer pool
2016-07-31 18:53:39 7f83161d9760  InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.
InnoDB: If you are installing InnoDB, remember that you must create
InnoDB: directories yourself, InnoDB does not create them.
160731 18:53:39 [ERROR] InnoDB: File /apps/dbdat/mariadb10_data3306//apps2/dbdat/ibdata3: 'create' returned OS error 71. Cannot cont
inue operation
160731 18:53:39 mysqld_safe mysqld from pid file /apps/dbdat/mariadb10_data3306/mysql.pid ende

從上面看到mysql其實是識別 /apps/dbdat/mariadb10_data3306//apps2/dbdat/ibdata3文件,因爲innodb_data_home_dir=/apps/dbdat/mariadb10_data3306有設置數據文件目錄,因此將設置從新改成以下:
innodb_data_home_dir=
innodb_data_file_path=/apps/dbdat/mariadb10_data3306/ibdata1:1704M;/apps/dbdat/mariadb10_data3306/ibdata2:1000M;/apps2/dbdat/ibdata3:100M:autoextend

---------這裏注意格式,分號和冒號

查看新磁盤中下的ibdat3文件已有產生,以下:[apps@mvxl0782 mariadb10_data3306]$ cd /apps2/dbdat[apps@mvxl0782 dbdat]$ ls -lttotal 102404-rw-rw---- 1 apps apps 104857600 Jul 31 19:00 ibdata3

相關文章
相關標籤/搜索