zoukankan      html  css  js  c++  java
  • 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;
    
  • 相关阅读:
    C# 验证IP地址、Email格式、URl网址
    如何创建、安装和调试Windows服务
    C#发送Email邮件方法总结
    C#调用java类、jar包方法。
    未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序
    在已经存在的表上创建索引
    Windows下的.NET+ Memcached安装
    把表从Access2007导出到Sql Server
    FusionCharts参数说明
    Sublime Text 3 之配置package control
  • 原文地址:https://www.cnblogs.com/plluoye/p/14223585.html
Copyright © 2011-2022 走看看