DM8中一条表空间创建语句引发的一点思考
在学习DM8数据库的过程中,安装数据库软件和初始化实例已经做过很多次,一般不会去选择创建DMHR和BOOKSHOP模式。之后突然想到一个问题,当创建达梦数据库实例的过程中没有指定创建BOOKSHOP和DMHR模式(DBCA的图形化方式可以直接指定,静默的DMINIT方式是否可以指定待确定,因为dminit help的输出中找不到关于这两个模式的关键词),那么创建实例之后,如何添加这两个示例模式?
经过在数据库软件目录搜索,发现在数据库软件安装目录(本例中为 /dmdb)下的 sqmples 路径下,可以找到创建脚本。
DMHR:/dmdb/samples/instance_script/dmhr
BOOKSHOP:/dmdb/samples/instance_script/bookshop
–创建 DMHR 模式示例:
[dmdba@dmdb2 UTF-8]$ pwd
/dmdb/samples/instance_script/dmhr/UTF-8
[dmdba@dmdb2 UTF-8]$ ll
total 280
-rwxr-xr-x. 1 dmdba dinstall 1271 Sep 7 17:12 CITY.sql
-rwxr-xr-x. 1 dmdba dinstall 121 Sep 7 17:12 CREATESCHEMA.sql
-rwxr-xr-x. 1 dmdba dinstall 6288 Sep 7 17:12 DEPARTMENT.sql
-rwxr-xr-x. 1 dmdba dinstall 253559 Sep 7 17:12 EMPLOYEE.sql
-rwxr-xr-x. 1 dmdba dinstall 3701 Sep 7 17:12 JOB_HISTORY.sql
-rwxr-xr-x. 1 dmdba dinstall 2062 Sep 7 17:12 JOB.sql
-rwxr-xr-x. 1 dmdba dinstall 1931 Sep 7 17:12 LOCATION.sql
-rwxr-xr-x. 1 dmdba dinstall 704 Sep 7 17:12 REGION.sql
[dmdba@dmdb2 UTF-8]$
[dmdba@dmdb2 UTF-8]$ cat CREATESCHEMA.sql
–创建表空间
CREATE TABLESPACE DMHR DATAFILE ‘DMHR.DBF’ size 128;
/
–创建模式
CREATE SCHEMA DMHR;
/
[dmdba@dmdb2 UTF-8]$
注意到CREATESCHEMA.sql脚本中创建表空间的语句,其引号内关于DATAFILE的内容,并没有写全路径,仅仅是一个数据文件的名字’DMHR.DBF’,(之后在《DM8_SQL语言使用手册》中也发现了多处这种写法)。
去翻《DM8系统管理员手册》14.1章节中管理表空间的内容,发现示例创建表空间语句写了数据文件所在路径和数据文件名,如下所示:
CREATE TABLESPACE bookshop DATAFILE ‘d:\bookshop1.dbf’ SIZE 128,‘d:\bookshop2.dbf’ SIZE 128;
那么像 CREATE TABLESPACE DMHR DATAFILE ‘DMHR.DBF’ size 128; 这种语法,达梦是怎么知道要把数据文件放在哪里的?如果是参数管理的,这个参数是什么?
按照传统数据库的经验,首先查是否有与 %DATAFILE% 相关的参数,发现没有,之后去查跟 %PATH% 相关的参数:
SQL> select para_name,para_value,para_type,description from v$dm_ini where para_name like ‘%PATH%’;
行号 PARA_NAME PARA_VALUE PARA_TYPE DESCRIPTION
1 CTL_PATH /dmdata/DMTEST2/dm.ctl READ ONLY path of dm.ctl
2 CTL_BAK_PATH /dmdata/DMTEST2/ctl_bak READ ONLY backup path of dm.ctl
3 SYSTEM_PATH /dmdata/DMTEST2 READ ONLY system path
4 CONFIG_PATH /dmdata/DMTEST2 READ ONLY config path
5 TEMP_PATH /dmdata/DMTEST2 READ ONLY temporary database file path
6 BAK_PATH /dmdata/DMTEST2/bak READ ONLY backup file path
7 AUD_PATH NULL READ ONLY audit log path
8 DFS_PATH $/DMTEST2 READ ONLY path of db_file in dfs
9 UNIX_SOCKET_PATHNAME NULL IN FILE Unix socket pathname
10 TRACE_PATH /dmdata/DMTEST2/trace READ ONLY System trace path name
11 DCR_PATH NULL IN FILE Path of dcr disk
12 REDOS_FILE_PATH_POLICY 0 READ ONLY
Data files’ path policy when standby instance applies CREATE TABLESPACE redo log. 0:use the same file name under system path, 1:use the same file path under the system path
13 XBOX_DUMP_PATH NULL READ ONLY
xbox_dump_path
13 rows got
已用时间: 7.134(毫秒). 执行号:600.
SQL>
–注意到其中 DFS_PATH 的值为 $/DMTEST2,这里的 “$” 会是初始化实例的时候 dminit 工具中指定的关键字 “PATH” 的路径吗?会不会是这个参数决定的?
–但是,又去查了一下达梦的DFS是什么,发现 http://blog.itpub.net/31403259/viewspace-2741097/ 有如下描述:
达梦透明分布式数据库由计算层、日志层、存储层和目录服务器构成。其中,日志层和存储层的各组件统称为分布式文件系统 DFS。
–查阅官方手册发现 DFS_PATH 确实是一个与 DMTDD 相关的参数,其中的描述:
DFS_PATH 初始化数据库服务器DS时指定 手动 在DMTDD系统中的数据库文件路径
–看起来 DFS_PATH 跟单机环境没什么关系,那么是否有其他可能的参数?
达梦手册中又找到了下边这两个参数:
SYSTEM_PATH 安装时指定 手动 系统库目录
CONFIG_PATH 安装时指定 手动 指定DMSERVER所读取的配置文件(DMMAL.INI, DMARCH.INI,DMTIMER.INI等)的路径。缺省使用SYSTEM_PATH路径。不允许指定ASM目录
–手动建立一个其他目录,修改这三个参数验证:
[dmdba@dmdb2 dmdata]$ pwd
/dmdata
[dmdba@dmdb2 dmdata]$ mkdir datafile
[dmdba@dmdb2 dmdata]$ ll
total 4
drwxr-xr-x. 2 dmdba dinstall 6 Nov 22 17:01 datafile
drwxr-xr-x. 6 dmdba dinstall 4096 Nov 22 17:00 DMTEST2
–修改dm.ini中 SYSTEM_PATH 为 SYSTEM_PATH = /dmdata/datafile
[dmdba@dmdb2 DMTEST2]$ DmServiceDMTEST2 start
Starting DmServiceDMTEST2: [ FAILED ]
file dm.key not found, use default license!
version info: develop
Server key decrypt failed!!
Server exit!!
[dmdba@dmdb2 DMTEST2]$
–SYSTEM_PATH修改后数据库服务都起不来了,将其改回原值后数据库服务可以启动
[dmdba@dmdb2 DMTEST2]$ DmServiceDMTEST2 start
Starting DmServiceDMTEST2: [ OK ]
[dmdba@dmdb2 DMTEST2]$ DmServiceDMTEST2 stop
Stopping DmServiceDMTEST2: [ OK ]
[dmdba@dmdb2 DMTEST2]$
–修改dm.ini中 CONFIG_PATH 为 /dmdata/datafile
[dmdba@dmdb2 DMTEST2]$ DmServiceDMTEST2 start
Starting DmServiceDMTEST2: [ OK ]
[dmdba@dmdb2 DMTEST2]$ disql / as sysdba
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.904(ms)
disql V8
SQL> select para_name,para_value,para_type,description from v$dm_ini where para_name like ‘%CONFIG_PATH%’;
行号 PARA_NAME PARA_VALUE PARA_TYPE DESCRIPTION
1 CONFIG_PATH /dmdata/datafile READ ONLY config path
已用时间: 50.228(毫秒). 执行号:500.
SQL>
SQL> create tablespace tbs1 datafile ‘tbs1.dbf’ size 128;
操作已执行
已用时间: 24.852(毫秒). 执行号:501.
SQL> set linesize 200 pagesize 999
SQL> select file_id,TABLESPACE_NAME,FILE_NAME,BYTES/1024/1024 sizem,STATUS,AUTOEXTENSIBLE,ONLINE_STATUS from dba_data_files order by 2,3;
行号 FILE_ID TABLESPACE_NAME FILE_NAME SIZEM STATUS AUTOEXTENSIBLE ONLINE_STATUS
1 0 MAIN /dmdata/DMTEST2/MAIN.DBF 128 AVAILABLE YES ONLINE
2 0 ROLL /dmdata/DMTEST2/ROLL.DBF 128 AVAILABLE YES ONLINE
3 0 SYSTEM /dmdata/DMTEST2/SYSTEM.DBF 26 AVAILABLE YES ONLINE
4 0 TBS1 /dmdata/DMTEST2/tbs1.dbf 128 AVAILABLE YES ONLINE
5 0 TEMP /dmdata/DMTEST2/TEMP.DBF 10 AVAILABLE YES ONLINE
6 0 YY_TBS /dmdata/DMTEST2/yy_tbso1.dbf 1024 AVAILABLE YES ONLINE
6 rows got
已用时间: 9.861(毫秒). 执行号:502.
SQL>
–发现未生效,新建的表空间 TBS1 其数据文件路径是 /dmdata/DMTEST2/tbs1.dbf。
–修改dm.ini中 DFS_PATH (dm.ini中原始配置为空, DFS_PATH = )为 DFS_PATH = /dmdata/datafile
SQL> select para_name,para_value,para_type,description from v$dm_ini where para_name like ‘%DFS_PATH%’;
行号 PARA_NAME PARA_VALUE PARA_TYPE DESCRIPTION
1 DFS_PATH $/DMTEST2 READ ONLY path of db_file in dfs --看起来虽然手动修改了 dm.ini ,但是在数据库内查询发现并没有生效。
已用时间: 4.884(毫秒). 执行号:503.
SQL>
SQL> create tablespace tbs2 datafile ‘tbs2.dbf’ size 128;
操作已执行
已用时间: 39.396(毫秒). 执行号:501.
SQL>
SQL> set linesize 200 pagesize 999
SQL> select file_id,TABLESPACE_NAME,FILE_NAME,BYTES/1024/1024 sizem,STATUS,AUTOEXTENSIBLE,ONLINE_STATUS from dba_data_files order by 2,3;
行号 FILE_ID TABLESPACE_NAME FILE_NAME SIZEM STATUS AUTOEXTENSIBLE ONLINE_STATUS
1 0 MAIN /dmdata/DMTEST2/MAIN.DBF 128 AVAILABLE YES ONLINE
2 0 ROLL /dmdata/DMTEST2/ROLL.DBF 128 AVAILABLE YES ONLINE
3 0 SYSTEM /dmdata/DMTEST2/SYSTEM.DBF 26 AVAILABLE YES ONLINE
4 0 TBS1 /dmdata/DMTEST2/tbs1.dbf 128 AVAILABLE YES ONLINE
5 0 TBS2 /dmdata/DMTEST2/tbs2.dbf 128 AVAILABLE YES ONLINE
6 0 TEMP /dmdata/DMTEST2/TEMP.DBF 10 AVAILABLE YES ONLINE
7 0 YY_TBS /dmdata/DMTEST2/yy_tbso1.dbf 1024 AVAILABLE YES ONLINE
7 rows got
已用时间: 8.926(毫秒). 执行号:502.
–发现未生效,新建的表空间 TBS2 其数据文件路径是 /dmdata/DMTEST2/tbs2.dbf。
–那么是不是 SYSTEM_PATH 决定的?或者说还有其他的参数或者机制?这是一个遗留问题。
–最后附上创建DMHR模式和相关对象的过程,执行这些脚本创建 DMHR 模式和数据表
[dmdba@dmdb2 UTF-8]$ disql / as sysdba
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 43.516(ms)
disql V8
SQL> ho pwd
/dmdb/samples/instance_script/dmhr/UTF-8
SQL>
SQL> start CREATESCHEMA.sql
SQL> --创建表空间
CREATE TABLESPACE DMHR DATAFILE ‘DMHR.DBF’ size 128;
操作已执行
已用时间: 48.280(毫秒). 执行号:4115.
SQL> /
–创建表空间
CREATE TABLESPACE DMHR DATAFILE ‘DMHR.DBF’ size 128;
第2 行附近出现错误[-3401]:表空间[DMHR]已存在.
已用时间: 0.383(毫秒). 执行号:0.
SQL> --创建模式
CREATE SCHEMA DMHR;
操作已执行
已用时间: 34.234(毫秒). 执行号:4116.
–注意这些脚本因为外键的关系有前后顺序:
REGION.sql --> CITY.sql --> LOCATION.sql --> DEPARTMENT.sql --> JOB.sql --> EMPLOYEE.sql --> JOB_HISTORY.sql
SQL>
start REGION.sql
start CITY.sql
start LOCATION.sql
start DEPARTMENT.sql
start JOB.sql
start EMPLOYEE.sql
start JOB_HISTORY.sql
–执行完以上脚本就可以操作 DMHR 模式下的表了。
SQL> select * from DMHR.JOB_HISTORY;
行号 EMPLOYEE_ID START_DATE END_DATE JOB_ID DEPARTMENT_ID
1 8107 2010-02-12 2012-04-16 22 802
2 9135 2011-08-25 2013-04-12 52 905
3 10102 2011-09-13 2014-06-25 12 1001
4 10114 2010-06-15 2014-07-08 42 1004
5 10126 2014-09-23 2014-10-20 42 1004
6 1106 2008-07-11 2014-11-02 22 102
7 1118 2008-01-22 2014-01-14 42 104
8 1129 2011-10-13 2014-02-15 42 104
9 1141 2010-03-22 2013-02-27 52 105
10 1152 2008-03-16 2013-03-20 52 105
11 2109 2009-09-27 2012-03-02 42 204
12 2120 2011-06-18 2012-04-14 42 204
13 3105 2014-03-03 2014-05-26 12 301
14 3117 2013-11-05 2014-05-08 22 302
15 3128 2009-05-03 2013-05-20 32 303
16 3140 2008-11-19 2013-06-02 32 303
17 3151 2012-07-19 2014-01-19 42 304
18 3167 2009-02-16 2014-01-01 52 305
19 3179 2009-07-27 2013-01-12 52 305
20 3190 2014-07-21 2014-11-26 62 306
20 rows got
已用时间: 1.614(毫秒). 执行号:3595.