关键字:、人大金仓、KingbaseES、dump
概述
在KES中,sys_dump可以将指定数据库备份为一个归档文件,通常为*.sql文件。它可以创建一致的备份,同时不阻塞其他用户访问数据库。在使用sys_dump来备份数据库时,根据原数据库中的对象将会根据使用EXISTS选项的方式不同,sys_dump在归档文件中会生成不同的脚本语句,通常为可执行的SQL语句。
sys_dump的常用参数
调用sys_dump的语法格式:
sys_dump [ option ...]
sys_dump涉及的option参数说明:
-a
只转储数据,而不转储模式(数据定义)。表数据、大对象和序列值都会被转储。
-C
该命令使得在输出的开始是创建数据库,并且重新连接到被创建的数据库(使用这种形式的脚本,在运行脚本之前连接的是目标安装中的哪个数据库都没有关系)。如果还指定了 --clean ,脚本会在重新连接之前删除并重建目标数据库。
-E encoding
以指定的字符集编码创建转储。默认情况下,转储会以数据库的编码创建(另一种得到相同结果的方式是将 KCICLIENTENCODING 环境变量设置成想要的转储编码)。
-f file
将输出发送到指定文件。对于基于输出格式的文件,这个参数可以被忽略,在这种情况下将使用标准输出。但是,对于目录输出格式必须给定这个参数,在目录输出格式中指定的是一个目录而不是一个文件。在这种情况中,该目录会由 sys_dump 创建,并且之前不能存在。
-O
不输出设置对象拥有关系来匹配原始数据库的命令。默认情况下,sys_dump 会发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句来设置被创建的数据库对象的拥有关系。
-V --version
打印 sys_dump 版本并退出。
--disable-dollar-quoting
这个选项禁止在函数体中使用美元符号引用,并且强制它们使用 SQL 标准字符串语法进行引用。
--if-exists
时间条件性命令(即增加一个 IF EXISTS 子句)来清除数据库和其他对象。 只有同时指定了 --clean 时,这个选项才可用。
--include-all-partitions[=opt]
仅在Oracle模式下生效。通过配置该参数值,控制在单独备份分区表时,是否同时备份该分区表下所有分区的结构和数据。 可选参数值有:1,0,t,f,on,off, 默认值为1。 当include-all-partitions=1/t/on时,指定 -t 参数导出分区表的主表时,自动导出所有子表; 当include-all-partitions=0/f/off时,指定 -t 参数导出分区表的主表时,不自动导出所有子表。
--no-comments
不转储注释。
-? --help
显示有关 sys_dump 命令行参数的帮助并退出。
-d dbname --dbname=dbname
指定要连接到的数据库名。这等效于指定 dbname 为命令行上的第一个非选项参数。
-h host --host=host
指定服务器正在运行的机器的主机名。如果该值开始于斜线,则将其用作 Unix 域套接字的目录。默认值取自 KINGBASE_HOST 环境变量(如果设置了),否则将尝次 Unix 域套接字连接。
-p port --port=port
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认是放在 KINGBASE_PORT 环境变量中(如果设置了),否则使用编译在程序中的默认值。
-U username --username=username
要作为哪个用户连接。
-w --no-password
不发出密码提示。如果服务器要求密码验证,并且密码不能通过其他方式获得(例如一个 .kbpass 文件),那么连接尝试将失败。这个选项对于在没有用户输入密码的批处理任务和脚本中有用。
-W --password
强制 sys_dump 在连接到一个数据库之前提示输入密码。
--role=rolename
指定用来创建转储的角色名。
sys_dump的EXISTS选项
在KES的mysql模式下,在CREATE和 ALTER和DROP相关语法内部分别增加了对IF NOT EXISTS子句和IF EXISTS子句的处理,不影响现有的功能以及备份还原、升级的兼容性。
在KES中,sys_dump直接导出的mysql模式的数据库的sql文件里不会存在IF NOT EXISTS语句或IF EXISTS语句,其只会记录数据库当前的状态,不包含用户的具体操作。
例:
- 在KES中先创建一个表
test=# create table if not exists tt1 (i int);
CREATE TABLE
- 查看dump后的sql文件,相关内容如下。显然if not exists语句并不会体现在dump生成的sql文件中。
-- Name: tt1; Type: TABLE; Schema: public; Owner: gaichao
CREATE TABLE public.tt1 (
i integer
);
ALTER TABLE public.tt1 OWNER TO gaichao;
- 红底为在文档中查找相关内容,不管是创建对象时是否添加if not exists语句、更改对象时是否添加if exists语句、删除对象时是否添加if exists语句(被删除的对象不会出现在sql文件中),这些用户的操作都不会体现在用户文件中。
E486: Pattern not found: if exists
E486: Pattern not found: if not
在KES中,用sys_dump来导出mysql模式的数据库,在导出时也不会包含和对象相关的DDL语句中的EXISTS选项。但是如果是PLSQL层面,如果用户在定义的函数中(不是定义函数时)使用了EXISTS选项,则导出的sql文件中会包含该EXISTS选项。
例:
在KES中,sys_dump导出的sql文件时,如果使--clean --if-exists选项,则生成的归档文件里会存在IF EXISTS语句,其主要用于恢复表时先判断表是否存在,当表存在时,会先删除现有的表,并按照sql文件内容恢复一个新的表。但是用户自己用if not exists创建的对象或者用if exists修改或删除的对象也不会体现在dump生成的sql文件中,即sys_dump生成的sql文件中的if exists语句和用户行为无关,是系统预先设计好的规则。
例:在使用sys_dump时添加--clean --if-exists选项后,生成的归档文件会先尝试删除当前数据库的同名对象: