云服务器内容精选

  • 注意事项 禁止修改导出的文件和内容,否则可能无法恢复成功。 为了保证数据一致性和完整性,gs_dumpall会对需要转储的表设置共享锁。如果某张表在别的事务中设置了共享锁,gs_dumpall会等待此表的锁释放后锁定此表。如果无法在指定时间内锁定某张表,转储会失败。用户可以通过指定--lock-wait-timeout选项,自定义等待锁超时时间。 由于gs_dumpall读取所有数据库中的表,因此必须以数据库管理员身份进行连接,才能导出完整文件。在使用gsql执行脚本文件导入时,同样需要管理员权限,以便添加用户和组,以及创建数据库。导入备份前,验证其安全性,防止管理员权限被利用。 使用gs_dumpall导出所有数据库对象,并希望在新的实例环境上进行导入时,需要保证导出和导入时使用用户的名称和权限相同,否则会出现名称不一致或权限不足的报错。 gs_dumpall导出的文件,在新的实例环境上进行导入时,连接的数据库必须是默认database。否则可能出现语法不兼容的情况,导致导入出错。 由于M-compatibility数据库全局只能创建一个,当导出的数据库中包含M-compatibility数据库时,须保证导入的目标实例环境上不存在其他的M-compatibility模式数据库。 对于定时任务,本工具仅支持导出在B兼容性数据库中,通过CREATE EVENT创建的定时任务或通过高级包创建的非周期性定时任务。 gs_dumpall不支持导出自定义Tokenweight分词词典,可以根据报错WARNING: dictionary xx cannot be automatically exported, please create it manually手动创建对应分词词典。 当导出的数据库中包含PDB时,使用gs_dumpall不会导出模板PDB及创建的PDB。 gs_dump时HTAP表创建IMCV元信息(gs_imcv系统表)不会被转储。 当指定转储编码存在转码场景时,且表中的数据存在非法编码的数据,导出会报错invalid byte sequence,建议使用gs_dump的-s参数只导出定义,并单独使用COPY打开编码容错进行数据的导出与导入。
  • 背景信息 gs_dumpall是 GaussDB 用于导出所有数据库相关信息工具,它可以导出数据库的所有数据,包括默认数据库postgres的数据、自定义数据库的数据、以及所有数据库公共的全局对象。 gs_dumpall工具在进行数据导出时,其他用户可以访问数据库(读或写)。 gs_dumpall工具支持导出完整一致的数据。例如,T1时刻启动gs_dumpall导出整个数据库,那么导出数据结果将会是T1时刻该数据库的数据状态,T1时刻之后对数据库的修改不会被导出。 gs_dumpall时生成列不会被转储。 gs_dump时HTAP表创建IMCV元信息(gs_imcv系统表)不会被转储。 gs_dumpall在导出所有数据库时分为两部分: gs_dumpall自身对所有数据库公共的全局对象进行导出,包括有关数据库用户和组,表空间以及属性(例如,适用于数据库整体的访问权限)信息。 gs_dumpall通过调用gs_dump来完成数据库中各数据库的SQL脚本文件导出,该脚本文件包含将数据库恢复为其保存时的状态所需要的全部SQL语句。 以上两部分导出的结果为纯文本格式的SQL脚本文件,使用gsql运行该脚本文件可以恢复数据库。 gs_dumpall支持SSL加密通信,使用方式同gsql方式。 使用gs_dumpall前请确保gs_dumpall版本与gs_dump版本、数据库版本保持一致,高版本gs_dump、gs_dump不保证完全兼容低版本内核数据。
  • 注意事项 禁止修改-F c/d/t 格式导出的文件和内容,否则可能无法恢复成功。对于-F p 格式导出的文件,如有需要,可谨慎编辑导出的文件。 为了保证数据一致性和完整性,gs_dump会对需要转储的表设置共享锁。如果表在别的事务中设置了共享锁,gs_dump会等待锁释放后锁定表。如果无法在指定时间内锁定某个表,转储会失败。用户可以通过指定--lock-wait-timeout选项,自定义等待锁超时时间。 不支持加密导出存储过程和函数。 对于物化视图,本工具仅支持物化视图定义的导出,在导入后需手动执行REFRESH命令来进行数据恢复。 对于临时对象,本工具仅支持导出全局临时表。 本工具不支持在备机上使用。 gs_dump导出分区索引时,部分索引分区的属性无法导出,比如索引分区的unusable状态。可以通过查询系统表PG_PARTITION或者查询视图ADM_IND_PARTITIONS/ADM_IND_SUBPARTITIONS获取索引分区的具体属性,通过ALTER INDEX命令可以手动设置索引分区属性。 对于定时任务,本工具仅支持导出在B兼容性数据库中,通过CREATE EVENT创建的定时任务或通过高级包创建的非周期性定时任务。 gs_dump不支持导出自定义Tokenweight分词词典,可以根据报错WARNING: dictionary xx cannot be automatically exported, please create it manually手动创建对应分词词典。 在多租场景下,使用gs_dump导出时,不支持导出模板PDB,也不支持导出关闭的PDB。 在多租场景下,普通用户使用gs_dump导出时,只能导出该用户有权限的数据库对象和数据。 当未开启多租时,gs_dump不支持导出PDB及其内的对象。 gs_dump时HTAP表创建IMCV元信息(gs_imcv系统表)不会被转储。 如果数据库中存在初始用户创建的表且表上有含用户自定义函数的表达式索引,系统管理员使用gs_dump导出后,需要使用初始用户通过gsql或gs_restore进行导入。否则会因为安全原因,导致创建索引失败。 普通用户不支持导出DIRECTORY、SYNONYM,若普通用户进行相关导出,会提示“WARNING: xx not dumped because current user is not a superuser”。
  • 说明 如果某数据库有任何本地数据要添加到template1数据库,请谨慎将gs_dump的输出恢复到一个真正的空数据库中,否则可能会因为被添加对象的定义被复制,出现错误。要创建一个无本地添加的空数据库,需从template0而非template1复制,例如: CREATE DATABASE foo WITH TEMPLATE template0; tar归档形式的文件大小不得超过8GB(tar文件格式的固有限制)。tar文档整体大小和任何其他输出格式没有限制,操作系统可能对此有要求。 由gs_dump生成的转储文件不包含优化程序用来做执行计划决定的统计数据。因此,建议从某转储文件恢复之后运行ANALYZE以确保最佳效果。转储文件不包含任何ALTER DATABASE…SET命令,这些设置由gs_dumpall转储,还有数据库用户和其他完成安装设置。
  • 语法 gs_dump [OPTION]... [DBNAME] “dbname”前面不需要加短或长选项。“dbname”指定要连接的数据库。 例如: 不需要-d,直接指定“dbname”。 gs_dump -p port_number testdb -f dump1.sql 或者 export PGDATABASE=testdb gs_dump -p port_number -f dump1.sql 环境变量:PGDATABASE
  • 示例 使用gs_dump转储数据库为SQL文本文件或其它格式的操作,如下所示。 示例中“backup/MPPDB_backup.sql”表示导出的文件,其中backup表示相对于当前目录的相对目录;“37300”表示数据库服务器端口;“testdb”表示要访问的数据库名。 导出操作时,请确保该目录存在并且当前的操作系统用户对其具有读写权限。 示例1:执行gs_dump,导出testdb数据库全量信息,导出的MPPDB_backup.sql文件格式为纯文本格式。 gs_dump -U omm -f backup/MPPDB_backup.sql -p 37300 testdb -F p gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 09:49:17]: The total objects number is 356. gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 09:49:17]: [100.00%] 356 objects have been dumped. gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 09:49:17]: dump database testdb successfully gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 09:49:17]: total time: 1274 ms 使用gsql程序从纯文本导出文件中导入数据。 示例2:执行gs_dump,导出testdb数据库全量信息,导出的MPPDB_backup.tar文件格式为tar格式。 gs_dump -U omm -f backup/MPPDB_backup.tar -p 37300 testdb -F t gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:02:24]: The total objects number is 1369. gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:02:53]: [100.00%] 1369 objects have been dumped. gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:02:53]: dump database testdb successfully gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:02:53]: total time: 50086 ms 示例3:执行gs_dump,导出testdb数据库全量信息,导出的MPPDB_backup.dmp文件格式为自定义归档格式。 gs_dump -U omm -f backup/MPPDB_backup.dmp -p 37300 testdb -F c gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:05:40]: The total objects number is 1369. gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:06:03]: [100.00%] 1369 objects have been dumped. gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:06:03]: dump database testdb successfully gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:06:03]: total time: 36620 ms 示例4:执行gs_dump,导出testdb数据库全量信息,导出的MPPDB_backup文件格式为目录格式。 gs_dump -U omm -f backup/MPPDB_backup -p 37300 testdb -F d gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:16:04]: The total objects number is 1369. gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:16:23]: [100.00%] 1369 objects have been dumped. gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:16:23]: dump database testdb successfully gs_dump[user='omm'][localhost][port='37300'][testdb][2018-06-27 10:16:23]: total time: 33977 ms
  • 背景信息 gs_dump是GaussDB用于导出数据库相关信息的工具,用户可以自定义导出一个数据库或其中的对象(模式、表、视图等)。支持导出的数据库可以是默认数据库postgres,也可以是自定义数据库。 gs_dump支持导出PDB。当导出PDB时,用户可以自定义导出一个PDB或其中的对象(模式、表、视图等)。 gs_dump工具在进行数据导出时,其他用户可以访问数据库(读或写)。 gs_dump工具支持导出完整一致的数据。例如,T1时刻启动gs_dump导出A数据库,那么导出数据结果将会是T1时刻A数据库的数据状态,T1时刻之后对A数据库的修改不会被导出。 gs_dump时生成列不会被转储。 gs_dump时HTAP表创建的IMCV元信息(gs_imcv系统表)不会被转储。 gs_dump支持导出兼容v1数据库的文本格式文件。 gs_dump支持将数据库信息导出至纯文本格式的SQL脚本文件或其他归档文件中。 纯文本格式的SQL脚本文件:包含将数据库恢复为其保存时的状态所需的SQL语句。通过gsql运行该SQL脚本文件,可以恢复数据库。即使在其他主机和其他数据库产品上,只要对SQL脚本文件稍作修改,也可以用来重建数据库。 归档格式文件:包含将数据库恢复为其保存时的状态所需的数据,可以是tar格式、目录归档格式或自定义归档格式,详见表1。 gs_dump支持SSL加密通信,使用方式同gsql方式。 使用gs_dump前请确保gs_dump版本与数据库版本保持一致,高版本gs_dump不保证完全兼容低版本内核数据。 gs_dump不适合库中对象数量过多的场景。当库中对象数量过多,或者对象间依赖关系过于复杂时,gs_dump导出时间会很长。
  • 主要功能 gs_dump可以创建四种不同的导出文件格式,通过[-F或者--format=]选项指定,具体如表1所示。 表1 导出文件格式 格式名称 -F的参数值 说明 建议 对应导入工具 纯文本格式 p 纯文本脚本文件包含SQL语句和命令。命令可以由gsql命令行终端程序执行,用于重新创建数据库对象并加载表数据。 小型数据库,一般推荐纯文本格式。 使用gsql工具恢复数据库对象前,可根据需要使用文本编辑器编辑纯文本导出文件。 自定义归档格式 c 一种二进制文件。支持从导出文件中恢复所有或所选数据库对象。 中型或大型数据库,推荐自定义归档格式。 使用gs_restore可以选择要从自定义归档/目录归档/tar归档导出文件中导入相应的数据库对象。 目录归档格式 d 该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。 - tar归档格式 t tar归档文件支持从导出文件中恢复所有或所选数据库对象。tar归档格式不支持压缩且对于单独表大小应小于8GB。 - 可以使用gs_dump工具将文件压缩为目录归档或自定义归档导出文件,减少导出文件的大小。生成目录归档或自定义归档导出文件时,默认进行中等级别的压缩。gs_dump程序无法压缩已归档导出文件。 M-Compatibility模式数据库下,禁止在lower_case_table_names参数不同的实例之间进行导入导出,否则可能引起数据丢失。
  • 优化建议 UN LOG GED UNLOGGED表和表上的索引因为数据写入时不通过WAL日志机制,写入速度远高于普通表。因此,可以用于缓冲存储复杂查询的中间结果集,增强复杂查询的性能。 UNLOGGED表无主备机制,在系统故障或异常断点等情况下,会有数据丢失风险,因此,不可用来存储基础数据。 TEMPORARY | TEMP 临时表只在当前会话可见,会话结束后会自动删除。 LIKE 新表自动从这个表中继承所有字段名及其数据类型和非空约束,新表与源表之间在创建动作完毕之后是完全无关的。 LIKE INCLUDING DEFAULTS 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。 LIKE INCLUDING CONSTRAINTS 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 LIKE INCLUDING INDEXES 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 LIKE INCLUDING STORAGE 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 LIKE INCLUDING COMMENTS 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 LIKE INCLUDING PARTITION 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不复制源表的分区定义。 列表/哈希分区表暂不支持LIKE INCLUDING PARTITION。 LIKE INCLUDING RELOPTIONS 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 LIKE INCLUDING IDENTITY 如果指定了INCLUDING IDENTITY,则创建一个和源表SEQUENCE参数相同的SEQUENCE来实现IDENTITY,并且IDENTITY类型与源表相同。默认情况下,不复制源表的IDENTITY。 LIKE INCLUDING ALL INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION、INCLUDING RELOPTIONS、INCLUDING IDENTITY和INCLUDING ILM的内容。 ORIENTATION ROW 创建行存表,行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。
  • 注意事项 如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小为0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。 使用JDBC时,支持通过PreparedStatement对DEFAULT值进行参数化设置。 被授予CREATE ANY TABLE权限的用户,可以在public模式和用户模式下创建表。如果想要创建包含serial类型列的表,还需要授予CREATE ANY SEQUENCE创建序列的权限。 XML类型不能作为主键、外键。 在为数据对象增加或者变更ILM策略的时候,如果追加了行级表达式,需要注意行表达式目前只支持白名单中列出的函数。具体白名单函数列表参考行表达式函数白名单。 表约束个数不能超过32767个。
  • 建表示例 创建普通表 gaussdb=# CREATE TABLE tbl_test1( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ); gaussdb=# DROP TABLE tbl_test1; WITH子句为表或者索引设置存储参数 --建表指定填充因子。 gaussdb=# CREATE TABLE tbl_test2( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ) WITH (FILLFACTOR = 70); --建表指定存储引擎。 gaussdb=# CREATE TABLE tbl_test3( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ) WITH (STORAGE_TYPE = ASTORE); --删除。 gaussdb=# DROP TABLE tbl_test2; gaussdb=# DROP TABLE tbl_test3; 临时表 --创建临时表。 gaussdb=# CREATE GLOBAL TEMP TABLE test_t1( id CHAR(7), name VARCHAR(20), province VARCHAR(60), country VARCHAR(30) DEFAULT 'China' ); --在当前会话中插入数据。 gaussdb=# INSERT INTO test_t1 VALUES ('0000009','Jack','Guangzhou','China'); --临时表里面的数据只在当前会话中可见,所以在另一个会话中查看该表中没有数据。 gaussdb=# SELECT * FROM test_t1; id | name | province | country ----+------+----------+--------- (0 rows) --创建临时表,并指定提交事务时删除该临时表数据。 gaussdb=# CREATE TEMPORARY TABLE test_t2( id CHAR(7), name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 ) ON COMMIT DELETE ROWS; --删除表。 gaussdb=# DROP TABLE test_t1; gaussdb=# DROP TABLE test_t2; 建表时指定字符集字符序 --创建前置数据库。 gaussdb=# CREATE DATABASE testdb1 DBCOMPATIBILITY = 'B' ENCODING = 'UTF8'; gaussdb=# \c testdb1 --创建t1表,设置t1的默认字符集为utf8mb4,默认字符序为utf8mb4_bin,设置c1字段为表的默认字符集字符序,设置c2字段的字符集为utf8mb4,字符序为utf8mb4_unicode_ci。 testdb1=# CREATE TABLE t1(c1 text, c2 text charset utf8mb4 collate utf8mb4_unicode_ci) charset utf8mb4 collate utf8mb4_bin; --删除。 testdb1=# DROP TABLE t1; testdb1=# \c postgres gaussdb=# DROP DATABASE testdb1; IF NOT EXISTS关键字 使用该关键字,表不存在时报NOTICE;如不用该关键字,则报ERROR。两种情况下表都不会创建成功。 gaussdb=# CREATE TABLE test_t3(id INT); --创建一个已经存在同名的表test_t3。 gaussdb=# CREATE TABLE test_t3(id INT); ERROR: Relation test_t3 already exists in schema public. DETAIL: Creating new table with existing name in the same schema. --使用IF NOT EXISTS关键字。 gaussdb=# CREATE TABLE IF NOT EXISTS test_t3(id INT); NOTICE: Relation test_t3 already exists, skipping. CREATE TABLE --删除表。 gaussdb=# DROP TABLE test_t3; 建表时指定表空间 --创建表空间。 gaussdb=# CREATE TABLESPACE ds_tbs1 RELATIVE LOCATION 'tablespace/tablespace_1'; --创建表时,指定表空间。 gaussdb=# CREATE TABLE test(id CHAR(7), name VARCHAR(20)) TABLESPACE ds_tbs1; --删除表和表空间。 gaussdb=# DROP TABLE test; gaussdb=# DROP TABLESPACE ds_tbs1;
  • 语法格式 创建表。 CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name { ( { column_name data_type [ CHARACTER SET | CHARSET charset ] [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] } [, ... ] ) | LIKE source_table } [ table_option [ [ , ] ... ] ] [ htap_option ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER n { day | month | year } OF NO MODIFICATION [ ON ( EXPR )]] [ TABLESPACE tablespace_name ]; 其中table_option为: { COMMENT [ = ] 'string' | AUTO_INCREMENT [ = ] value | [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset | [ DEFAULT ] COLLATE [ = ] default_collation | ENGINE [ = ] { InnoDB | 'InnoDB' | "InnoDB" }} 其中htap_option为: { COLVIEW [ PRIORITY { HIGH | LOW | NONE } ] | NOCOLVIEW [ PRIORITY { HIGH | LOW | NONE } ]} 其中列约束column_constraint为: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | ON UPDATE update_expr | GENERATED ALWAYS AS ( generation_expr ) [STORED] | GENERATED [ ALWAYS | BY DEFAULT [ ON NULL ] ] AS IDENTITY [ ( identity_options ) ] | AUTO_INCREMENT | COMMENT 'string' | COLVIEW | NOCOLVIEW | UNIQUE [KEY] index_parameters | PRIMARY KEY index_parameters | ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | REFEREN CES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中列的压缩可选项compress_mode为: { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } 其中表约束table_constraint为: [ CONSTRAINT [ constraint_name ] ] { CHECK ( expression ) | UNIQUE [ index_name ] [ USING method ] ( { { column_name [ ( length ) ] | ( expression ) } [ ASC | DESC ] } [, ... ] ) index_parameters | PRIMARY KEY [ USING method ] ( { column_name [ ASC | DESC ] } [, ... ] ) index_parameters | FOREIGN KEY [ index_name ] ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] { [ COMMENT 'string' ] [ ... ] } 其中like选项like_option为: { INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | UPDATE | IDENTITY | ILM | ALL } 其中索引参数index_parameters为: [ WITH ( {storage_parameter = value} [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ] 其中update_expr为: { CURRENT_TIMESTAMP | LOCALTIMESTAMP | NOW() }
  • 优化建议 UNLOGGED UNLOGGED表和表上的索引因为数据写入时不通过WAL日志机制,写入速度远高于普通表。因此,可以用于缓冲存储复杂查询的中间结果集,增强复杂查询的性能。 UNLOGGED表无主备机制,在系统故障或异常断点等情况下,会有数据丢失风险,因此,不可用来存储基础数据。 TEMPORARY | TEMP 临时表只在当前会话可见,会话结束后会自动删除。 除了当前CN外,其他CN对于该临时表不可见。 LIKE 新表自动从这个表中继承所有字段名及其数据类型和非空约束,新表与源表之间在创建动作完毕之后是完全无关的。 LIKE INCLUDING DEFAULTS 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。 LIKE INCLUDING CONSTRAINTS 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 LIKE INCLUDING INDEXES 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 LIKE INCLUDING STORAGE 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 LIKE INCLUDING COMMENTS 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 LIKE INCLUDING PARTITION 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不复制源表的分区定义。 LIKE INCLUDING RELOPTIONS 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 LIKE INCLUDING DISTRIBUTION 如果指定了INCLUDING DISTRIBUTION,则源表的分布信息会复制到新表中,包括分布类型和分布列,同时新表将不能再使用DISTRIBUTE BY子句。默认情况下,不复制源表的分布信息。 LIKE INCLUDING ALL INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION、INCLUDING RELOPTIONS、INCLUDING DISTRIBUTION和INCLUDING ILM的内容。 ORIENTATION ROW 创建行存表,行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 DISTRIBUTE BY 事实表或者数据量较大的维度表建议创建为分布表。对指定的列进行Hash,通过映射,把数据分布到指定DN。语法为:DISTRIBUTE BY HASH(column_name)。 数据量较小的维度表建议创建为复制表。表的每条记录存在所有数据节点(DN)中,即每个数据节点都有完整的表数据。语法为: DISTRIBUTE BY REPLICATION。
  • 表数据分布示例 REPLICATION gaussdb=# CREATE TABLE test_replication( id CHAR(7), name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY REPLICATION; --查询表信息。 gaussdb=# \d+ test_replication Table "public.test_replication" Column | Type | Modifiers | Storage | Stats target | Description ----------+-----------------------+------------------------------------+----------+--------------+------------- id | character(7) | | extended | | name | character varying(20) | | extended | | province | character varying(60) | | extended | | country | character varying(30) | default 'China'::character varying | extended | | Has OIDs: no Distribute By: REPLICATION Location Nodes: ALL DATANODES Options: orientation=row, logical_repl_node=-1, compression=no, storage_type=USTORE, segment=off --删除。 gaussdb=# DROP TABLE test_replication; HASH --定义一个表,使用HASH分布。 gaussdb=# CREATE TABLE test_hash( id CHAR(7), name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY HASH(id); --插入数据。 gaussdb=# INSERT INTO test_hash VALUES ('0000001', 'Bob', 'Shanghai', 'China'), ('0000002', 'Jack', 'Beijing', 'China'), ('0000003', 'Scott', 'Beijing', 'China'); --查看数据分布情况。 gaussdb=# SELECT a.count,b.node_name FROM (SELECT COUNT(*) AS count, xc_node_id FROM test_hash GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC; count | node_name -------+------------------- 2 | dn_6001_6002_6003 1 | dn_6004_6005_6006 --删除表。 gaussdb=# DROP TABLE test_hash; MURMURHASH --测试环境包含1个CN和6个DN。 --创建NODEGROUP,NODEGROUP中的DN名字可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询,查询的结果按需替换CREATE NODE GROUP语句中WITH后的DN名。 gaussdb=# CREATE NODE GROUP NG1 WITH(datanode1, datanode2, datanode3, datanode4, datanode5, datanode6); --定义一个表,使用MURMURHASH分布。 gaussdb=# CREATE TABLE test_murmurhash1 (a int NOT NULL, b int) DISTRIBUTE BY MURMURHASH(a) TO GROUP NG1; gaussdb=# CREATE TABLE test_murmurhash2 (a int NOT NULL, b int) DISTRIBUTE BY MURMURHASH(lpad_s(a,10,'0')) TO GROUP NG1; --插入数据。 gaussdb=# INSERT INTO test_murmurhash1 VALUES(0,1); gaussdb=# INSERT INTO test_murmurhash2 VALUES(1,2); --查询数据。 gaussdb=# SELECT * FROM test_murmurhash1; a | b ---+--- 0 | 1 (1 row) gaussdb=# SELECT * FROM test_murmurhash2; a | b ---+--- 1 | 2 (1 row) --删除表。 gaussdb=# DROP TABLE test_murmurhash1; gaussdb=# DROP TABLE test_murmurhash2; --删除NODE GROUP。 gaussdb=# DROP NODE GROUP NG1; RANGE --定义一个表,使用RANGE分布(需要根据实际情况修改dn名字,查询dn节点名可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询)。 gaussdb=# CREATE TABLE test_range( id INT, name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY RANGE(id)( SLICE s1 VALUES LESS THAN (100) DATANODE dn_6001_6002_6003, SLICE s2 VALUES LESS THAN (200) DATANODE dn_6004_6005_6006, SLICE s3 VALUES LESS THAN (MAXVALUE) DATANODE dn_6007_6008_6009 ); --插入数据。 gaussdb=# INSERT INTO test_range VALUES (52, 'Bob', 'Beijing', 'China'); gaussdb=# INSERT INTO test_range VALUES (100, 'Ben', 'Shanghai', 'China'); gaussdb=# INSERT INTO test_range VALUES (150, 'Scott', 'Guangzhou', 'China'); gaussdb=# INSERT INTO test_range VALUES (300, 'Jordan', 'Beijing', 'China'); --查看数据分布情况。 gaussdb=# SELECT a.count,b.node_name FROM (SELECT COUNT(*) AS count, xc_node_id FROM test_range GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC; count | node_name -------+------------------- 2 | dn_6004_6005_6006 1 | dn_6001_6002_6003 1 | dn_6007_6008_6009 (3 rows) --查询各dn上存储的数据。 gaussdb=# SELECT b.node_name, a.* FROM (SELECT *, xc_node_id FROM test_range) a, pgxc_node b WHERE a.xc_node_id=b.node_id order by node_name; node_name | id | name | province | country | xc_node_id -------------------+-----+--------+-----------+---------+------------- dn_6001_6002_6003 | 52 | Bob | Beijing | China | -1072999043 dn_6004_6005_6006 | 100 | Ben | Shanghai | China | -564789568 dn_6004_6005_6006 | 150 | Scott | Guangzhou | China | -564789568 dn_6007_6008_6009 | 300 | Jordan | Beijing | China | 1532339558 (4 rows) --删除表。 gaussdb=# DROP TABLE test_range; LIST --定义一个表,使用LIST分布(需要根据实际情况修改dn名字,查询dn节点名可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询)。 gaussdb=# CREATE TABLE test_list( id INT, name VARCHAR(20), country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY LIST(country)( SLICE s1 VALUES ('China') DATANODE dn_6001_6002_6003, SLICE s2 VALUES ('USA') DATANODE dn_6004_6005_6006, SLICE s3 VALUES (DEFAULT) DATANODE dn_6007_6008_6009 ); --插入数据。 gaussdb=# INSERT INTO test_list VALUES (1,'Scott','China'); gaussdb=# INSERT INTO test_list VALUES (2,'Henry','USA'); gaussdb=# INSERT INTO test_list VALUES (3,'Michael','France'); gaussdb=# INSERT INTO test_list VALUES (4,'Jack','UK'); --查询各dn上存储的数据。 gaussdb=# SELECT b.node_name, a.* FROM (SELECT *, xc_node_id FROM test_list) a, pgxc_node b WHERE a.xc_node_id=b.node_id order by node_name; node_name | id | name | country | xc_node_id -------------------+----+---------+--------+------------- dn_6001_6002_6003 | 1 | Scott | China | -1072999043 dn_6004_6005_6006 | 2 | Henry | USA | -564789568 dn_6007_6008_6009 | 3 | Michael | France | 1532339558 dn_6007_6008_6009 | 4 | Jack | UK | 1532339558 (4 rows) --删除表。 gaussdb=# DROP TABLE test_list;
  • 建表示例 创建普通表 gaussdb=# CREATE TABLE tbl_test1( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ); gaussdb=# DROP TABLE tbl_test1; WITH子句为表或者索引增加存储参数 --建表指定填充因子。 gaussdb=# CREATE TABLE tbl_test2( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ) WITH (FILLFACTOR = 70); --建表指定存储引擎。 gaussdb=# CREATE TABLE tbl_test3( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ) WITH (STORAGE_TYPE = ASTORE); --删除。 gaussdb=# DROP TABLE tbl_test2; gaussdb=# DROP TABLE tbl_test3; 临时表 --创建临时表,并指定提交事务时删除该临时表数据。 gaussdb=# CREATE TEMPORARY TABLE test_t2( id CHAR(7), name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 ) ON COMMIT DELETE ROWS; gaussdb=# DROP TABLE test_t2; 建表时指定字符集字符序 --创建前置数据库。 gaussdb=# CREATE DATABASE testdb1 ENCODING = 'UTF8'; gaussdb=# \c testdb1 --创建t1表,设置t1的默认字符集为utf8mb4,默认字符序为utf8mb4_bin,设置c1字段为表的默认字符集字符序,设置c2字段的字符集为utf8mb4,字符序为utf8mb4_unicode_ci。 testdb1=# CREATE TABLE t1(c1 text, c2 text charset utf8mb4 collate utf8mb4_unicode_ci) charset utf8mb4 collate utf8mb4_bin; --删除。 testdb1=# DROP TABLE t1; testdb1=# \c postgres gaussdb=# DROP DATABASE testdb1; IF NOT EXISTS关键字 使用该关键字,表不存在时报NOTICE;如不用该关键字,则报ERROR。两种情况下表都不会创建成功。 gaussdb=# CREATE TABLE test_t3(id INT); --创建一个已经存在同名的表test_t3。 gaussdb=# CREATE TABLE test_t3(id INT); ERROR: Relation test_t3 already exists in schema public. DETAIL: Creating new table with existing name in the same schema. --使用IF NOT EXISTS关键字。 gaussdb=# CREATE TABLE IF NOT EXISTS test_t3(id INT); NOTICE: Relation test_t3 already exists, skipping. CREATE TABLE --删除表。 gaussdb=# DROP TABLE test_t3; 建表时指定表空间 --创建表空间。 gaussdb=# CREATE TABLESPACE ds_tbs1 RELATIVE LOCATION 'tablespace/tablespace_1'; --创建表时,指定表空间。 gaussdb=# CREATE TABLE test(id CHAR(7), name VARCHAR(20)) TABLESPACE ds_tbs1; --删除表和表空间。 gaussdb=# DROP TABLE test; gaussdb=# DROP TABLESPACE ds_tbs1;