Mysql 創建外部表


15.6.1.2 Creating Tables Externally
https://dev.mysql.com/doc/refman/8.0/en/innodb-create-table-external.html

為什么要創建外部表?

創建外部表,也就是在數據目錄之外創建表
原因可能包括空間管理、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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM