Mysql 建立外部表
阿新 • • 發佈:2021-01-03
15.6.1.2 Creating Tables Externally
為什麼要建立外部表?
建立外部表,也就是在資料目錄之外建立表
原因可能包括空間管理、I/O 優化或將表放置在具有特定效能或容量特徵的儲存裝置上。
建立外部表,有三種方式:
- Using the
DATA DIRECTORY
Clause - Using
CREATE TABLE ... TABLESPACE
Syntax - Creating a Table in an
External General Tablespace
前提條件:
innodb_file_per_table=1
這裡驗證第一種
1.建立資料目錄 mkdir /opt/mysql/data1 chown mysql.mysql /opt/mysql/data1 2.建立外部表 -- data directory mysql -uroot -proot cym1 SQL> create table t1(id int primary key); SQL> create table t2(id int primary key) data directory='/opt/mysql/data1'; 3.查看錶空間檔案 [root@mysql]# ls /opt/mysql/data/cym1 -- 預設目錄下,儲存了t2 表的frm 和 isl 檔案 db.opt t1.frm t1.ibd t2.frm t2.isl [root@mysql]# ls /opt/mysql/data1/cym1 -- 外部目錄只有 ibd 檔案 t2.ibd [root@mysql]# more /opt/mysql/data/cym1/t2.isl -- isl檔案接指向了t2的表空間檔案。 /opt/mysql/data1/cym1/t2.ibd
能否改動外部表位置?
mkdir /opt/mysql/data2 chown mysql.mysql /opt/mysql/data2 mysql -uroot -proot cym1 SQL> alter table t2 data directory='/opt/mysql/data2'; Query OK, 0 rows affected, 1 warning (0.00 sec) Records: 0 Duplicates: 0 Warnings: 1 -- 檢視資料檔案 [root@mysql]# ls /opt/mysql/data2/ [root@mysql]# ls /opt/mysql/data1/ cym1 [root@mysql]# more /opt/mysql/data/cym1/t2.isl /opt/mysql/data1/cym1/t2.ibd
以上,改動位置失敗,不支援改動。
能否手工修改檔案isl檔案?
mkdir /opt/mysql/data2/cym1 chown mysql.mysql /opt/mysql/data2/cym1 vi /opt/mysql/data/cym1/t2.isl /opt/mysql/data1/cym1/t2.ibd -> /opt/mysql/data2/cym1/t2.ibd mv /opt/mysql/data1/cym1/t2.ibd /opt/mysql/data2/cym1/t2.ibd mysql -uroot -proot cym1 SQL> desc t2; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.00 sec) SQL> insert into t2 select 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 SQL> select * from t2; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
以上,手工可以修改表空間檔案的位置,不需要重啟資料庫,可立刻生效。
修改表空間檔案位置是否影響資料庫啟動關閉?
SQL> SHUTDOWN;
Query OK, 0 rows affected (0.01 sec)
[root@mysql]# mysqld &
[1] 28930
[root@mysql]# mysql -uroot -proot cym1
SQL> select * from t2;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.01 sec)
資料庫正常啟動關閉。再確認下表空間檔案位置:
[root@mysql]# ls /opt/mysql/data1/cym1/
[root@mysql]# ls /opt/mysql/data2/cym1/t2.ibd
/opt/mysql/data2/cym1/t2.ibd
[root@mysql]# more /opt/mysql/data/cym1/t2.isl
/opt/mysql/data2/cym1/t2.ibd
資料檔案位置的確變了。
生產環境中可能需要先把表設為只讀才可以修改位置,請測試後操作,修改後不需要重啟資料庫即可生效。
flush table t2 with read lock;
unlock tables;