CREATE DATABASE(含分布式)

CREATE DATABASE — 创建一个新数据库

Synopsis

CREATE DATABASE name
    [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ DISTRIBUTED [=] distributed ]
           [ ENCODING [=] encoding ]
           [ LOCALE [=] locale ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ] ]
           [ LIGHTDB_SYNTAX_COMPATIBLE_TYPE [=] compa_type ] ]
           [ LIGHTDB_MYSQL_LOWER_CASE_TABLE_NAMES [=] mysql_lower_case ] ]
           [ LIGHTDB_ASCII_ZERO_STORE_VALUE [=] ascii_zero_store_value ]

描述

CREATE DATABASE创建一个新的LightDB数据库。

要创建一个数据库,你必须是一个超级用户或者具有特殊的CREATEDB特权。见CREATE ROLE

在 LightDB 23.4 版本之前,默认情况下,新数据库将通过克隆标准系统数据库template1被创建。从 LightDB 23.4 开始,标准系统数据库不再是template1,而是 template_pgtemplate_oracle 或者 template_mysql 三者之一。

Table 304. 不同的语法兼容模式 LIGHTDB_SYNTAX_COMPATIBLE_TYPE 支持不同的模板:

TemplateLIGHTDB_SYNTAX_COMPATIBLE_TYPE
offoraclemysql
template0supportsupportsupport
template1not supportnot supportnot support
template_pgsupportnot supportnot support
template_oraclenot supportsupportnot support
template_mysqlnot supportnot supportsupport

在创建数据库时,数据库的语法兼容模式必然是 offoracle 或者 mysql 三者之一。此时如果额外指定的模板参数和语法兼容模式不兼容,则会提示错误。如果 GUC 参数lightdb_ignore_template_compatible_type_mismatch 的值被设置为 true,则 LightDB 会忽略模板选项,offoraclemysql 语法兼容模式会各自使用 template_pgtemplate_oracletemplate_mysql 作为默认模板。

可以通过写TEMPLATE name指定一个不同的模板。特别地,通过写TEMPLATE template0你可以创建一个原始的数据库(其中没有用户定义的对象存在并且系统对象没有被更改),它将只包含你的LightDB版本所预定义的标准对象。如果你希望避免拷贝任何可能被加入到标准系统数据库中的本地安装对象,这将有所帮助。

请注意:当在创建数据库的过程中提供了用户创建的模板时,兼容性模式检查会被跳过。

参数

name

要创建的数据库名。

user_name

将拥有新数据库的用户的角色名,或者用DEFAULT来使用默认值(即,执行该命令的用户)。要创建一个被另一个角色拥有的数据库,你必须是该角色的一个直接或间接成员,或者是一个超级用户。

template

要从其创建新数据库的模板名称,或者用DEFAULT来使用默认模板(在 LightDB 23.4 版本之前默认为 template_1,从 LightDB 23.4 开始为 template_pgtemplate_oracletemplate_mysql)。

distributed

distributed 设置为DEFAULT 时,其值为 true; 可以被设置成 false/true,off/on 等值。当值被设置成 true 时,在通过 installer 安装分布式数据库环境下,创建的数据库直接为分布式数据库,不需要进行额外操作;在集中式环境下,创建的数据库为普通数据库。当值被设置成 false 时,不论在何种环境下,创建的数据库都为普通数据库。

encoding

要在新数据库中使用的字符集编码。指定一个字符串常量(例如'SQL_ASCII'),或者一个整数编码编号,或者DEFAULT来使用默认的编码(即,模板数据库的编码)。LightDB服务器所支持的字符集在Section 22.3.1中描述。附加限制见下文。

locale

这是一个同时设置LC_COLLATELC_CTYPE的快捷方式。 如果指定此参数,您不能指定这些参数中的任何一个。

Tip

其他语言环境设置 lc_messages, lc_monetary, lc_numeric, and lc_time不是每个数据库固定的, 也不是由该命令设置的。 如果要将它们设置为特定数据库的默认值,则可以使用 ALTER DATABASE... SET.

lc_collate

要在新数据库中使用的排序规则顺序(LC_COLLATE)。这会影响应用到字符串的排序顺序,例如在带 ORDER BY 的查询中,以及文本列上索引所使用的顺序。默认是使用模板数据库的排序规则顺序。附加限制见下文。

lc_ctype

要在新数据库中使用的字符分类(LC_CTYPE)。这会影响字符的类别,如小写、大写和数字。默认是使用模板数据库的字符分类。附加限制见下文。

tablespace_name

将与新数据库相关联的表空间名称,或者DEFAULT来使用模板数据库的表空间。这个表空间将是在这个数据库中创建的对象的表空间。详见CREATE TABLESPACE

allowconn

如果为假,则没有人能连接到这个数据库。默认为真,表示允许连接(除了 被其他机制约束以外,例如GRANT/REVOKE CONNECT)。

connlimit

这个数据库允许多少并发连接。-1 (默认值)表示没有限制。

istemplate

如果为真,则任何具有CREATEDB特权的用户都可以从 这个数据库克隆。如果为假(默认),则只有超级用户或者该数据库的拥有者 可以克隆它。

compa_type

如果值是oracle,那么这个数据库可以使用oracle的一些功能。 如果值是mysql,那么这个数据库可以使用mysql的一些功能。 如果这些值处于禁用状态,则此数据库无法使用上述功能。 默认值由lightdb_syntax_compatible_type指定

更多关于oracle和mysql的特性,见 lightdb_dblevel_syntax_compatible_type

mysql_lower_case

在Mysql兼容模式下,是否开启表名全小写特性。mysql_lower_case的取值为(1,true,on,0,false,off)中的一个,默认值是1。(1,true,on):开启 (0,false,off):不开启

ascii_zero_store_value

Lightdb 23.3引入了一个新的数据库级别GUC参数lightdb_ascii_zero_store_value。 此参数取值范围为0到32,包含0,32。数据库创建时设定,之后不能修改。

更多关于GUC lightdb_ascii_zero_store_value 的信息,请参考 lightdb_ascii_zero_store_value

可选的参数可以被写成任何顺序,不用按照上面说明的顺序。

注解

CREATE DATABASE不能在一个事务块内被执行。

带有一行不能初始化数据库目录的错误大部分与在数据目录上权限不足、磁盘满或其他文件系统问题有关。

使用DROP DATABASE移除一个数据库。

程序createdb是这个命令的一个包装器程序,为了使用方便而提供。

数据库层面的配置参数(参见 ALTER DATABASE)和 数据库级权限(参见GRANT)不会从模板数据库中复制。

尽管可以通过指定一个数据库作为模板来从其中而不是标准系统数据库复制,这(还)不是COPY DATABASE功能的一般目的。主要的限制是在模板数据库被拷贝期间其他会话不能连接到它。如果CREATE DATABASE启动时还存在任何其他连接,它将失败。否则,到模板数据库的新连接将被挡在外面直到CREATE DATABASE完成。详见Section 21.3

为新数据库指定的字符集编码必须与选定的区域设置(LC_COLLATELC_CTYPE)相兼容。如果区域是C(或者等效的POSIX),那么所有编码都被允许,但是对于其他区域设置只有一种编码能正确工作。CREATE DATABASE将允许超级用户指定SQL_ASCII编码而不管区域设置,但是这种选择已被废弃并且可能在数据与数据库中存储的区域不是编码兼容时让字符串函数行为失当。

编码和区域设置必须匹配模板数据的编码和区域,除非template0被用作模板。这是因为其他数据库可能包含不匹配指定编码的数据,或者可能包含排序顺序受LC_COLLATELC_CTYPE影响的索引。拷贝这种数据将导致一个由于该新设置损坏的数据库。不过,template0是不会含有任何可能被影响的数据或索引的。

CONNECTION LIMIT选项大概是唯一会被强制的,如果两个新会话在大约同一时间开始并且那时该数据库只剩有一个连接,可能两者都会失败。还有,该限制对超级用户或后台工作进程无效。

自23.1版本以来,LightDB支持在执行CREATE DATABASE命令时创建具有相同名称的用户。 该特性仅在oracle兼容模式时生效,不支持分布式。 自动创建的同名用户对创建的数据库具有CREATE、CONNECT、TEMPORARY和LOGIN权限。

例子

要创建一个新数据库:

CREATE DATABASE lusiadas;

要在一个默认表空间salesspace中创建一个被用户salesapp拥有的新数据库sales

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

要用不同的语言环境创建数据库music

CREATE DATABASE music
    LOCALE 'sv_SE.utf8'
    TEMPLATE template0;

在这个例子中,如果指定的语言环境与template1中的语言环境不同, 则需要TEMPLATE template0子句。(如果不是,则明确指定区域设置是多余的。)

要用不同的语言环境和不同的字符集编码创建数据库music2

CREATE DATABASE music2
    LOCALE 'sv_SE.iso885915'
    ENCODING LATIN9
    TEMPLATE template0;

指定的区域设置和编码设置必须匹配,否则会报告错误。

请注意,区域名称是特定于操作系统的, 因此上述命令可能无法在任何地方以相同的方式工作。

在创建数据库testdb之前,查询数据库列表和用户列表:

lightdb@postgres=# \l
                                List of databases
   Name          |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges
-----------------+---------+----------+-------------+-------------+---------------------
 lt_test         | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |
 postgres        | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |
 template0       | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 template1       | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 template_pg     | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 template_mysql  | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 template_oracle | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
(7 rows)

lightdb@postgres=# 
lightdb@postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 lightdb   | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

lightdb@postgres=# 

To create a database in oracle compatibility mode:

lightdb@postgres=# create database testdb with lightdb_syntax_compatible_type oracle;
NOTICE:  auto create user "testdb" success
CREATE DATABASE
lightdb@postgres=# 

Query the database list and user list again:

lightdb@postgres=# \l
                                List of databases
   Name          |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------------+---------+----------+-------------+-------------+---------------------
 lt_test         | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
 postgres        | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
 template0       | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 template1       | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 template_pg     | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 template_mysql  | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 template_oracle | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/lightdb         +
                 |         |          |             |             | lightdb=CTc/lightdb
 testdb          | lightdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/lightdb        +
                 |         |          |             |             | lightdb=CTc/lightdb+
                 |         |          |             |             | testdb=CTc/lightdb
(8 rows)

lightdb@postgres=# 
lightdb@postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 lightdb   | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 testdb    |                                                            | {}

lightdb@postgres=# 

兼容性

在 SQL 标准中没有CREATE DATABASE语句。数据库等效于目录,而目录的创建由实现定义。

创建分布式数据库

LihgtDB分布式模式安装部署后,分布式集群会默认部署在postgres库中,针对其他业务库,需先手动在CN和DN每个节点中create database创建对应业务库,然后将每个节点添加到pg_dist_node表中。

-- 查看分布式节点信息
SELECT * from pg_dist_node;
 nodeid | groupid | nodename  | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards
--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+----------------+------------------
      1 |       1 | localhost |    12345 | default  | f           | t        | primary  | default     | f              | t
      2 |       2 | localhost |    12346 | default  | f           | t        | primary  | default     | f              | t
      3 |       3 | localhost |    12347 | default  | f           | t        | primary  | default     | f              | t
(3 rows)
    

设置分布式CN节点:通过canopy_set_coordinator_host函数进行配置;

    select canopy_set_coordinator_host('CN_NODE_IP', CN_NODE_PORT);
    

添加分布式DN节点:通过canopy_add_node函数进行配置;

    -- 在CN节点上执行该步骤即可,对应的DN节点会同步分布式集群信息
    select canopy_add_node('DN_NODE_IP', DN_NODE_PORT); 
    

删除节点:通过canopy_remove_node函数进行配置;

    select canopy_remove_node('NODE_IP', NODE_PORT);
    

参见

ALTER DATABASE, DROP DATABASE