Archives for September 2006

纯手工安装Oracle 10g

一般而言,所谓的手工安装数据库是先安装好Oracle应用程序,然后再创建数据库。 这里所谓的纯手工安装Oracle服务器是指除了不用自己从源码编译应用程序,其他都自己动手:不使用UI来安装执行程序,不使用DBCA来安装实例和数据库,取而代之的是完全手工配置,手工安装Oracle Service、修改注册表、安装实例和数据库等。 这种安装方式只是为了亲身体验一番Oracle数据库的安装过程,详细了解GUI背后的工作。 * 这不应该在产品服务器上尝试,纯属体验:) * 主要分为两个主要步骤:创建实例和创建数据库。 1. 选择一台安装好Oracle的服务器,拷贝可执行程序。 需要拷贝的是ORACLE_HOME下的程序,如C:\oracle\product\10.2.0\db_1。 不需要拷贝数据文件、联机日志、归档日志、Flashback区域中的文件等,一来因为容量问题,二来这些都可以在事后创建——如果完整拷贝就失去意义了。总的文件大小应该少于1G,否则很可能是拷贝了包含数据库数据的文件。 2. 创建用户组:ORA_DBA,并将当前用户加入ORA_DBA用户组。 3. 将程序目录C:\oracle\product\10.2.0\db_1\BIN 加入PATH变量。 4. 添加注册表内容,如ORACLE_BASE,ORACLE_HOME等。 例子: [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE] Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE] “inst_loc”=”C:\\Program Files\\Oracle\\Inventory” [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1] “ORACLE_HOME”=”c:\\oracle\\product\\10.2.0\\db_1″ “ORACLE_HOME_NAME”=”OraDb10g_home1″ “ORACLE_GROUP_NAME”=”Oracle – OraDb10g_home1″ “NLS_LANG”=”AMERICAN_AMERICA.AL32UTF8″ “ORACLE_BUNDLE_NAME”=”Enterprise” “SQLPATH”=”c:\\oracle\\product\\10.2.0\\db_1\\dbs” “ORACLE_HOME_KEY”=”SOFTWARE\\ORACLE\\KEY_OraDb10g_home1″ “MSHELP_TOOLS”=”c:\\oracle\\product\\10.2.0\\db_1\\MSHELP” “ORACLE_BASE”=”c:\\oracle\\product\\10.2.0″ “RDBMS_CONTROL”=”c:\\oracle\\product\\10.2.0\\db_1\\DATABASE” “RDBMS_ARCHIVE”=”c:\\oracle\\product\\10.2.0\\db_1\\DATABASE\\ARCHIVE” “ORACLE_SID”=”MISSBB” “ORA_MISSBB_AUTOSTART”=hex(2):54,00,52,00,55,00,45,00,00,00 “ORA_MISSBB_SHUTDOWN”=hex(2):54,00,52,00,55,00,45,00,00,00 “ORA_MISSBB_SHUTDOWN_TIMEOUT”=hex(2):39,00,30,00,00,00 “ORA_MISSBB_SHUTDOWNTYPE”=hex(2):69,00,6d,00,6d,00,65,00,64,00,69,00,61,00,74,\ 00,65,00,00,00 [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\SYSMAN] [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\SYSMAN\OracleDBConsoleMISSBB] “EMDROOT”=”c:\\oracle\\product\\10.2.0\\db_1″ “ORACLE_HOME”=”c:\\oracle\\product\\10.2.0\\db_1″ “EMSTATE”=”c:\\oracle\\product\\10.2.0\\db_1\\myhost.cn.madm.net_MISSBB” “CONSOLE_CFG”=”dbconsole” [...]

Data Guard常用参数小记

这里我并不想写一篇安装手册,而是对data guard相关的一些常用参数做简单的注解。 db_name Primary Database 和 Standby Database名称必须相同。否则在启动时会提示控制文件中的数据库名不对。 Asktom上面有一个活生生的例子。 db_unique_name 这是一个推荐的参数,不管是primary还是standby都尽量设置这个值。 fal_client和fal_server FAL是Fetch Archived Log的简写,意思是从主库中抓取日志。这两个参数只在standby role的时候起作用。建议在Primary数据库中也设置这两个参数,这样在role transition后(Primary转为Standby)也能正常运行。 log_archive_dest_1 用于设置本地归档路径,primary和standby都应该设置这个参数。例子: log_archive_dest_1=’location=D:\xzb\oradata\arch valid_for=(all_logfiles,all_roles) db_unique_name=orcl’ log_archive_dest_2 设置standby对象和运行模式,该参数只在primary中有效。如: log_archive_dest_2=’service=stdby LGWR SYNC AFFIRM valid_for=(online_logfiles,primary_role) db_unique_name=stdby’ LGWR SYNC AFFIRM表示MAXIMUM PROTECTION模式。推荐设置net_timeout参数。 log_archive_dest_3 作用跟log_archive_dest_2相同,只是在primary转换为standby时使用。如果需要switchover或failover,则建议设置这个参数。 log_archive_dest_state_(n) 应该设置为ENABLE。 log_archive_max_processes 设置ARCn个数,默认是4个。 standby_file_management 在Physical standby下面,如果主数据库有修改数据文件(如新建,重命名等)则自动在standby中做相应修改。 设为AUTO表示自动管理。设为MANUAL表示需要手工管理。 Oracle使用SYS帐号与standby进行通信,因为两个数据库的SYS帐号密码必须一致。并且,remote_login_passwordfile应该为EXCLUSIVE。

重建控制文件解决ORA-01103

复制产品数据库时在参数文件中修改了数据库名,startup时会出现ORA-01103错误。 SQL> startup mount ORACLE instance started. Total System Global Area 167772160 bytes Fixed Size 1247876 bytes Variable Size 71304572 bytes Database Buffers 88080384 bytes Redo Buffers 7139328 bytes ORA-01103: database name ‘ORCL’ in control file is not ‘TESTDB’ 这表示测试数据库中的参数DB_NAME跟控制文件中的不一致。解决办法是: 1. 修改DB_NAME。 2. 重建控制文件。 先备份产品数据库的控制文件: SQL > alter database backup controlfile to trace; Database altered. [...]

由 ORA-12514 联想到的

在Linux下,我很少用GUI,能不用就尽量不用。在Windows下,使用纯字符界面有时候简直成了奢侈。我相信,菜单永远比命令更易令人懒惰。 今天在装standby的时候,顺手将production上的listener.ora,sqlnet.ora,tnsnames.ora拷贝过来,登录时难得遇见了ORA-12514错误。 C:\>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 – Production on Sat Sep 9 18:53:39 2006 Copyright (c) 1982, 2005, Oracle. All rights reserved. ERROR: ORA-12560: TNS:protocol adapter error Enter user-name: C:\>sqlplus sys/install@stdby as sysdba SQL*Plus: Release 10.2.0.1.0 – Production on Sat Sep 9 18:53:49 2006 Copyright (c) 1982, 2005, Oracle. All rights reserved. [...]

Oracle中随机抽取N条记录

工作中经常用到随机数,比如随机抽取奖券,随机抽取某地区的客户样本等。在Oracle中可以非常方便地实现这个功能。 方法1:使用SAMPLE()。 使用sample的语法是: SAMPLE [ BLOCK ] (sample_percent) [ SEED (seed_value) ] BLOCK: 表示使用随机块例举而不是随机行例举。 sample_percent是随机获取一张表中记录的百分比。比如值为10,那就是表中的随机的百分之10的记录。值必须大于等于.000001,小于100。 seed表示从哪条记录返回,类似于预先设定例举结果,因而每次返回的结果都是固定的。该值必须介于0和4294967295之间。 接下来举例说明: SQL> create table zeeno as select * from dba_objects; Table created. SQL> select object_name from zeeno sample(10) where rownum=1; OBJECT_NAME ————————————————————- UET$ SQL> / OBJECT_NAME ————————————————————- ICOL$ 上面的示例表示从表zeeno中随机抽取10%的记录,并从中选择一条记录。 如果使用seed,则返回固定的集。 1* select object_name from zeeno sample(10) seed(10) where rownum=1 [...]