最近抽空练习了下手工建库,在10g的时候基本都在20分钟搞定,在11g中其实还可以更快,因为10g中需要配置的admin目录,需要创建bdump,udump之类的目录等等,在11g都被adr给默认替代了,只要提供了$ORACLE_BASE,就会默认在$ORACLE_BASE下生成对应的目录结构。
其它步骤完全可以按照10g的脚本来使用,没有任何问题,但是如果反过来,在11g里使用的一些语句在10g中可能会有一些问题,这一点也是在今天的测试中发现的一个小细节。
首先我在11g的库中创建了一个数据库实例,使用create database来完成,创建语句类似下面的形式。
CREATE DATABASE mynewdb USER SYS IDENTIFIED BY sys_password USER SYSTEM IDENTIFIED BY system_password
LOGFILE GROUP 1 ('/u01/logs/my/redo01a.log','/u02/logs/my/redo01b.log') SIZE 100M BLOCKSIZE 512, GROUP 2 ('/u01/logs/my/redo02a.log','/u02/logs/my/redo02b.log') SIZE 100M BLOCKSIZE 512, GROUP 3 ('/u01/logs/my/redo03a.log','/u02/logs/my/redo03b.log') SIZE 100M BLOCKSIZE 512 MAXLOGFILES 5 MAXLOGMEMBERS 5 MAXLOGHISTORY 1 MAXDATAFILES 100 CHARACTER SET AL32UTF8 NATIONAL CHARACTER SET AL16UTF16 EXTENT MANAGEMENT LOCAL DATAFILE '/u01/app/oracle/oradata/mynewdb/system01.dbf' SIZE 325M REUSE SYSAUX DATAFILE '/u01/app/oracle/oradata/mynewdb/sysaux01.dbf' SIZE 325M REUSE DEFAULT TABLESPACE users DATAFILE '/u01/app/oracle/oradata/mynewdb/users01.dbf' SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED DEFAULT TEMPORARY TABLESPACE tempts1 TEMPFILE '/u01/app/oracle/oradata/mynewdb/temp01.dbf' SIZE 20M REUSE UNDO TABLESPACE undotbs DATAFILE '/u01/app/oracle/oradata/mynewdb/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
这个语句基本不用修改太多的地方,基本就是文件的路径,结构部分不用做任何修改。
11g的实例很快就创建完成了。然后就想直接引用这个现成的脚本,简单修改一下路径,数据库实例名,在10g的环境中创建一个数据库实例。
但是却报出了下面的错误。
SQL> @createdb.sql
LOGFILE GROUP 1 ('/u02/oracle/oradata/TEST10G/disk1/redo01a.log','/u02/oracle/oradata/TEST10G/disk2/redo01b.log') SIZE 100M BLOCKSIZE 512,
*
ERROR at line 4:
ORA-02165: invalid option for CREATE DATABASE
对于这个错误自己还是很疑惑,不知道是哪儿出了问题,开始以为是做路径替换的时候出了问题,排除了乱码等的影响。最后发现语句实在没有其它的问题了。
这个时候把10g的创建语句拿出来比较一下,发现有3处不同之处。
CREATE DATABASE mynewdb
USER SYS IDENTIFIED BY pz6r58
USER SYSTEM IDENTIFIED BY y1tz5p
LOGFILE GROUP 1 ('/u01/oracle/oradata/mynewdb/redo01.log') SIZE 100M,
GROUP 2 ('/u01/oracle/oradata/mynewdb/redo02.log') SIZE 100M,
GROUP 3 ('/u01/oracle/oradata/mynewdb/redo03.log') SIZE 100M
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 100
MAXINSTANCES 1
CHARACTER SET US7ASCII
NATIONAL CHARACTER SET AL16UTF16
DATAFILE '/u01/oracle/oradata/mynewdb/system01.dbf' SIZE 325M REUSE
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE '/u01/oracle/oradata/mynewdb/sysaux01.dbf' SIZE 325M REUSE
DEFAULT TABLESPACE tbs_1
DEFAULT TEMPORARY TABLESPACE tempts1
TEMPFILE '/u01/oracle/oradata/mynewdb/temp01.dbf'
SIZE 20M REUSE
UNDO TABLESPACE undotbs
DATAFILE '/u01/oracle/oradata/mynewdb/undotbs01.dbf'
SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
第一处是关于redo日志组的设置,10g中默认配置一组日志中只有一个日志成员。在11g中是默认有2个
第二个不同之处是在10g中有一个配置MAXINSTANCES,在11g中缺没有,因为是单实例数据库,是在找不出理由是这个地方的不同引起的问题。
第三个问题就更加明显了,在10g中 只有一句default tablespace tbs_1 然后没有定义明细的信息,这个语句是不能运行的,还需要手工去补充,在11g中,语句已经补充完整了。只需要简单的根据自己的需求需要一下就可以了。
所以第二个第三个问题是很明显的,应该不是问题的原因,那么我们看看第一处不同,还有什么地方有可能会导出语句出问题。
11g中这样定义的
LOGFILE GROUP 1 ('/u01/logs/my/redo01a.log','/u02/logs/my/redo01b.log') SIZE 100M BLOCKSIZE 512,
10g中是这样定义的
LOGFILE GROUP 1 ('/u01/oracle/oradata/mynewdb/redo01.log') SIZE 100M,
除了日志成员的不同外,还有一个地方就是blocksize的不同了,在10g中没有blocksize的字样。
带着试试看的态度把blocksize去掉,然后再次运行语句,语句就运行成功了。
问题解决了,我们来看看blocksize是什么东东。
这个值是在数据库的源代码中固定的,与操作系统相关,默认的值为512. 在不同的os中可能会有所不同。
查看blocksize的配置,可以使用基表。
这个Log size可以从Oracle的内部视图中获得:
SQL> select max(lebsz) from x$kccle; MAX(LEBSZ) ---------- 512 |
所以可见在10g,11g的很多细节之处还是会存在一定的差距,11g中也在不断的进行改进。