2012年7月30日星期一

2.控制文件与数据文件的内容

2.1 控制文件的内容
转存控制文件查看其中的内容:
alter session set events 'immediate trace name controlf level 8' ;
select value from v$diag_info where name='Default Trace File';
以上select获得当前session的转储文件的名称。
2.2 SCN :是数据库中重要的数据结构,标识数据库某个确切时刻提交的版本。
oracle数据库是通过SCN和CHECKPOINT来保证数据库的一致性、可恢复性等重要属性。
在事务提交时,它被赋予一个唯一的标示事务的SCN。可看作oracle数据库内部时钟机制,可以被看作逻辑时钟,每个数据库都有一个全局的SCN生成器。
2.2.2 获取SCN
select dbms_flashback.get_system_change_number from dual;
转储数据文件头,观察其具体信息及检查点记录等:
alter session set events 'immediate trace name file_hdrs level 10' ;
select value from v$diag_info where name='Default Trace File';

2.3 检查点(checkpoint)
数据库事件,由CKPT进程触发,当检查点发生时,CKPT进程会负责通知DBWR进程将脏数据(DIRTY BUFFER)写到数据文件上。CKPT进程的另外一个职责是负责更新数据文件头及控制文件上的检查点信息。

当检查点发生时,(此时的 SCN 被称为 Checkpoint SCN ) Oracle会通知 DBWR 进程,把修改过的数据,也就是此Checkpoint SCN 之前的脏数据(dirty data)从buffer cache 写入磁盘,当写入完成后,CKPT进程则会相应更新控制文件和数据文件头,记录检查点信息,标识变更。
Checkpoint SCN 可以从数据库中查询得到:
select file#,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi:ss') CPT from v$datafile ;
select dbif,checkpoint_change# from v$database ;
2.3.2 常规检查点与增量检查点
常规检查点(complete checkpoint)按特定的条件触发,log_checkpoint_interval\log_checkpoint_timeout参数设置及log switch等条件触发,触发时定入完成后会同时更新数据文件头以及控制文件记录检查点信息。

增量检查点:incremental checkpoint 。引入了检测点对列(checkpoint queue,CKPTQ)机制
通过检查点,数据库可以将以前的全量写出变为增量渐进写出,从而可以极大地减少对数据库性能的影响;检查点对列则进一步地将RBA和检查点关联起来,从而可以通过检查点来确定恢复的起点。
检查点队列在数据库内部通过latch 保护:
select name,gets,misses from v$latch where name='checkpoint queue latch';

checkpoint queue latch 存在多个子latch ,可以通过 v$latch_children视图查询:
select name,gets,misses from v$latch_children where name='checkpoint queue latch'

另一个影响checkpoint SCN 的是FILEQ 队列,在Buffer Cache 中,每个buffer 的header 上都存在CKPTQ 以及 FILEQ  队列信息,通过如下命令可以转储Buffer cache信息
(在测试环境中尝试)
alter session set events 'immediate trace name buffers level 10';
其中BH 段中有ckptq[xxx.xxx],fileq[xxx,xxx],中括号中代表前一个块和后一个块的地址。

grep xxx_ora_1467.trc | grep -v NULL
可以得到对应块的对列 顺序,同样 在SGA中存在一块内存区域用于记录这个检查点队列:
select name,bytes from v$sgastat where uppper(name) like '%CHECKPOINT%';

从oracle 8i开始,只有以下两种情况下才会出现完全检查点:
  • alter system checkpoint ;
  • shutdown (除abort方式外)。

log  switch 事件同样触发的是增量检查点,但是在log switch 触发的检查点会促使数据文件头与控制文件信息同步。

2.3.4 控制文件与数据文件头信息
 CKPT的一项任务是更新数据文件头和控制文件,记录检查点信息,这些信息对于数据库的恢复和完整性校验都至关重要,接下来看一下控制文件 和数据文件 头的记录信息:
alter session set events 'immediate trace name file_hdrs level 10';

2.3.5 数据库的启动验证
转储控制文件和数据文件 ,比较 控制文件中的 checkpoint cnt。

关于控制文件、数据文件以及在启动过程的校验,我们可以从另一个角度进行进一不步验证。用以下步骤跟踪库的启动过程,可以获得跟踪文件
SQL> startup nomount ;
SQL> alter session set events='10046 trace name context forever,level 12';
SQL> alter database mount ;

2.3.7 FAST_START_MTTR_TARGET
在数据库中,增量检查点是通过 Fast_Start Checkpointing 特性来实现的。从8i开始,这一特性包含在ORACLE企业版的Fast-Start Fault Recovery 组件之中:
select * from v$version where rownum < 2;
select * from v$option where parameter ='Fast-Start Fault Recovery';

oracle推荐设置fast_start_mttr_target参数 代替fast_start_io_target\log_checkpoint_timeout\log_checkpoint_interval参数
MTTR建议视图:
select * from v$mttr_target_advice;
该视图评估在不同fast_start_mttr_target设置下中,系统需要执行的I/O次数等操作。
同时 视图对信息的收集 受到 参数 statistics_level 参数 值 的影响 。
show parameter statistics_level
也可以查询 v$statistics_level视图 来查询 MTTR AdviceR 的当时设置:
select statistics_name, description from v$statistics_level where statistics_name='MTTR Advice';

数据库当时的实例 恢复 状态可以通过视图V$INSTANCE_RECOVERY 查询得到:

select RECOVERY_ESTIMATED_IOS reio,ACTUAL_REDO_BLKS arb,TARGET_REDO_BLKS trb,LOG_FILE_SIZE_REDO_BLKS lfsrb,LOG_CHKPT_TIMEOUT_REDO_BLKS lctrb,LOG_CHKPT_INTERVAL_REDO_BLKS lcirb,FAST_START_IO_TARGET_REDO_BLKS fsiotrb,TARGET_MTTR tmttr,ESTIMATED_MTTR emttr,CKPT_BLOCK_WRITES cbw from v$instance_recovery ;

      REIO        ARB        TRB      LFSRB      LCTRB      LCIRB    FSIOTRB      TMTTR      EMTTR        CBW
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
        47        115       4370    6794766       4370                                0         18     292964

  1. 通常 TARGET_MTTR(代表的期望平均恢复时间) 要等于 fast_start_mttr_target参数设置值
  2. 当ESTIMATED_MTTR 大于 接近  fast_start_mttr_target 或 target_mttr时 系统会出现检查点。此时DBWR正忙于写出,甚至出现checkpoint 不能及时完成的情况。
2.3.9 自动检查点调整
FAST_START_MTTR_TARGET 设置成 0 即是自动调整检查点。

SQL> select RECOVERY_ESTIMATED_IOS reio,TARGET_MTTR tmttr,ESTIMATED_MTTR tmttr,WRITES_MTTR wmttr,WRITES_OTHER_SETTINGS woset,CKPT_BLOCK_WRITES ckptbw,WRITES_AUTOTUNE wauto,WRITES_FULL_THREAD_CKPT wftckpt from v$instance_recovery ;

      REIO      TMTTR      TMTTR      WMTTR      WOSET     CKPTBW      WAUTO    WFTCKPT
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
     10265          0         51          0          0     294026    1347981          0

SQL>
以上writes_autotune 字段值就是指由于自动调整检查点执行的写出次数据 ,而ckpt_block_writes指的是由于检查点写出的block的数量。

以上语句中的writes_autotune 和 下面结果的第一行比较:
select name,value from v$sysstat where upper(name) like '%DBWR%';--第一行
自动调整检查点下,两者应该是相等的。(11g要减去 tablespace 的ckpt)

2.3.10 检查点信息及恢复的起点:
alter session set events 'immediate trace name controlf level 8';
select value from v$diag_info where name = 'Default Trace File';

***************************************************************************
CHECKPOINT PROGRESS RECORDS
***************************************************************************
 (size = 8180, compat size = 8180, section max = 11, section in-use = 0,
  last-recid= 0, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 2, numrecs = 11)

*** 2012-07-25 15:18:13.263
THREAD #1 - status:0x2 flags:0x0 dirty:54010
low cache rba:(0x7a.33be5f.0) on disk rba:(0x7c.1657da.0)
on disk scn: 0x0005.e06aef77 07/25/2012 15:18:10
resetlogs scn: 0x0000.00000001 07/13/2012 20:02:34
heartbeat: 789056516 mount id: 1316572153
THREAD #2 - status:0x0 flags:0x0 dirty:0
low cache rba:(0x0.0.0) on disk rba:(0x0.0.0)
on disk scn: 0x0000.00000000 01/01/1988 00:00:00
resetlogs scn: 0x0000.00000000 01/01/1988 00:00:00
heartbeat: 0 mount id: 0

其中的
low cache rba 指在cache中 ,最低rba地址,崩溃恢复从这开始。
on disk rba 是磁盘上最高重做值,在进行恢复时应用重做至少要达到这个值。

 2.3.11 正常关闭数据库的状况
SQL> shutdown immediate
SQL> startup mount
SQL> alter session set events 'immediate trace name CONTROLF level 12';
SQL> @gettrcname

2.3.12
可用 fast_start_parallel_rollback 参数来控制并行回滚(false,low,high).

2.3.13 数据库并行恢复案例一则
无commit=y 的导出操作
imp username/passwd file=D:\bk\cf.dmp log=D:\bk\cf.log ignore=y buffer=819200 feedback=10000
由于没有分批量提交,当导入系统影响大,imp被中断。中断导致了这个大事务回滚,











2012年7月23日星期一

深入解析oracle--总结

1.alter database mount;
  这一过程数据库需要计算 mount id 并将其记录在控制文件中,然后开始启动心跳(heartbeat),每3秒更新一次控制文件。可用以下命令间隔3秒转储2次控制文件信息:
alter session set enents 'immediate trace name CONTROLF level 8';
cd dump 下用diff xx.trc  xx.trc 比较两个文件的不同。只有heartbeat的值不同。
2.也可用sys查内部表得到heartbeat的值X$KCCCP(Kernel Cache Controlfile managerment Checkpoint Progress);
select CPHBT from X$KCCCP;
SQL> select event#,name from v$event_name where name like '%heart%';

    EVENT# NAME
---------- --------------------------------------------------
        75 heartbeat monitor sleep
       380 ASM mount : wait for heartbeat
       563 control file heartbeat

SQL>
3.备份控制文件;
alter database backup controlfile to trace;
4.db_unique_name
5.orapwd file=orapworcl password=oracle entries=5
6.oracle_base在11g引入到了数据库的内部,增加了隐含参数。
SQL> select x.ksppinm name,y.ksppstvl value,x.KSPPDESC PDESC from sys.x$ksppi x,sys.x$ksppcv y where x.indx=y.indx and x.ksppinm like '%&par%' ;
SQL> /
输入par的值: oracle_base
old: 2: x.indx=y.indx and x.ksppinm like '%&par%'
new: 2: x.indx=y.indx and x.ksppinm like '%oracle_base%'

NAME                 VALUE                PDESC
-------------------- -------------------- --------------------
__oracle_base        /extdata/oracle      ORACLE_BASE

SQL>
7.ADR:automatic diagnostic repository.
  select * from v$diag_info ;其中diag_alert和diag trace对应目录分别存储了xml和文本格式的街区日志文件。
8.ADR之于诊断文件,就类似于OFA(Optimal Flexible Architecture)之于数据库文件,FRA(Flash Recovery Area)之于备份文件。
9.ADR 是 11g的新特性 故障诊断基础架构(Fault Diagnosability Infrastructure)的一角。
ips 属于FDI 的事件打包服务(Incident Packaging Service,IPS).
10.adrci
   adrci> show incident
   adrci> show incident -mode DETAIL -p "incident_id=14601"
   cd /extdata/oracle/diag/rdbms/orcl/orcl/incident/incident_14601
   ls -l
   使用如下命令可以为14601号incident创建逻辑package
   adrci> set homepath diag/rdbms/orcl/orcl/
   adrci> ips create package incident 14601
   进一步用如下命令生成物理package
   adrci> ips generate package 1 in /extdata/oracle/diag

1.2 数据库的访问
   select sid,username,machine,program from v$session where username='SYSTEM' ;
   select instance_name,startup_time,version from v$instance;
   select sid,program from v$session ;

    监听器不是默认的名称、端口 要设置 LOCAL_LISTENER参数:
    local_listener=listener_alias
    对于共享服务器模式,可以设置为:
    DISPATCHERS="(PROTOCOL=tcp)(LISTENER=listener1)"

 对于RAC环境,监听器可以向远程服务器注册:
 orcl1的remote_listener=listener_orcl2
 orcl2的remote_listener=listener_orcl1
 在orcl1的tnsnames.ora中:
 listener_orcl2=
 (description=
 (address=(protocol=tcp)(host=orcl2-server)(port=1521)))
 在orcl2上同样把listener_orcl1解析。

 show parameter remote_lis
 alter system set REMOTE_LISTENER='LISTENERS_ALIAS' scope=both sid='*';
 listener.ora 中:
 LISTENER_ORCL =
   (ADDRESS_LIST =
      (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.100)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.101)(PORT=1521))
   )

RAC环境的tnsnames.ora多个实例地址信息,同时支持负载均衡和在多实例之间的Failover

smsrac =
  (description =
     (address=(protocol=tcp)(host=192.168.100.100)(port=1521))
     (address=(protocol=tcp)(host=192.168.100.101)(port=1521))
     (load_balance=yes)
     (connect_data=
        (service=dedicated)
        (service_name=smsrac)
        (failover_mode =
           (type=select)
           (method=basic)
           (retries=180)
           (delay=5)
      )
     )
    )













2012年7月20日星期五

V$PWFILE_USERS和密码文件关系

1、验证密码文件已经修改
SQL> create user xff01 identified by xifenfei;
User created.
SQL> grant sysdba to xff01;
Grant succeeded.

SQL> !md5sum $ORACLE_HOME/dbs/orapwora11g
04cedb56b62d94fd7e14124619722348  /opt/oracle/product/11.2.0/db_1/dbs/orapwora11g

SQL> !strings /opt/oracle/product/11.2.0/db_1/dbs/orapwora11g
]\[Z
ORACLE Remote Password file
INTERNAL
A1174901D667F113
18698BFD1A045BCC
XFF01
D32693095588EF4F

SQL> revoke sysdba from xff01;
Revoke succeeded.

SQL> !strings /opt/oracle/product/11.2.0/db_1/dbs/orapwora11g
]\[Z
ORACLE Remote Password file
INTERNAL
A1174901D667F113
18698BFD1A045BCC
XFF01
D32693095588EF4F

SQL> !md5sum $ORACLE_HOME/dbs/orapwora11g
1f6d120acb913a1877cfb0ab57702744  /opt/oracle/product/11.2.0/db_1/dbs/orapwora11g

2、查看基表
SQL> col owner for a20
SQL> col object_name for a30
SQL> SELECT owner,object_name,object_type FROM DBA_objects WHERE object_NAME ='V$PWFILE_USERS';

OWNER                OBJECT_NAME                    OBJECT_TYPE
-------------------- ------------------------------ -------------------
PUBLIC               V$PWFILE_USERS                 SYNONYM

SQL> SELECT table_owner,TABLE_name FROM Dba_Synonyms a WHERE a.synonym_name='V$PWFILE_USERS';

TABLE_OWNER                    TABLE_NAME
------------------------------ ------------------------------
SYS                            V_$PWFILE_USERS

SQL> SELECT owner,object_name,object_type FROM dba_objects WHERE object_name='V_$PWFILE_USERS';

OWNER                OBJECT_NAME                    OBJECT_TYPE
-------------------- ------------------------------ -------------------
SYS                  V_$PWFILE_USERS                VIEW

SQL> set long 1000
SQL> set line 200
SQL> SELECT dbms_metadata.get_ddl('VIEW','V_$PWFILE_USERS','SYS') FROM DUAL;

DBMS_METADATA.GET_DDL('VIEW','V_$PWFILE_USERS','SYS')
--------------------------------------------------------------------------------

  CREATE OR REPLACE FORCE VIEW "SYS"."V_$PWFILE_USERS" ("USERNAME", "SYSDBA", "SYSOPER", "SYSASM") AS
  select "USERNAME","SYSDBA","SYSOPER","SYSASM" from v$pwfile_users

SQL> select * from v$fixed_table where name ='V$PWFILE_USERS';

NAME                            OBJECT_ID TYPE   TABLE_NUM
------------------------------ ---------- ----- ----------
V$PWFILE_USERS                 4294951116 VIEW       65537

SQL> select VIEW_DEFINITION from v$fixed_view_definition where view_name='V$PWFILE_USERS';

VIEW_DEFINITION
--------------------------------------------------------------------------------------------------------
select  USERNAME , SYSDBA , SYSOPER, SYSASM from GV$PWFILE_USERS where inst_id = USERENV('Instance')

SQL> select VIEW_DEFINITION from v$fixed_view_definition where view_name='GV$PWFILE_USERS';

VIEW_DEFINITION
------------------------------------------------------------------------------------------------------------
select inst_id,username,decode(sysdba,1,'TRUE','FALSE'),  decode(sysoper,1,'TRUE','FALSE'),
 decode(sysasm,1,'TRUE','FALSE')  from x$kzsrt where valid=1  and username != 'INTERNAL'

SQL> set line 100
SQL> desc x$kzsrt
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ADDR                                                           RAW(8)
 INDX                                                           NUMBER
 INST_ID                                                        NUMBER
 USERNAME                                                       VARCHAR2(30)
 SYSDBA                                                         NUMBER
 SYSOPER                                                        NUMBER
 SYSASM                                                         NUMBER
 VALID                                                          NUMBER

SQL> col username for a10
SQL> select * from x$kzsrt;

ADDR                   INDX    INST_ID USERNAME       SYSDBA    SYSOPER     SYSASM      VALID
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00002B9563678690          0          1 INTERNAL            1          1          0          1
00002B9563678690          1          1 SYS                 1          1          0          1
00002B9563678690          2          1 XFF01               0          0          0          0
  
从这里可以看出V$PWFILE_USERS视图的基表是x$kzsrt,这里和我们查看的密码文件一样,这些记录都存在,而是在密码文件中有不被strings显示的字符表示了账号是否启用,x$kzsrt.valid用1和0标示

2012年7月19日星期四

oracle passord file

错误日志:Oracle启动报ORA-01031: insufficient privileges错误!
解决:
C:/Documents and Settings>orapwd file=%ORACLE_HOME%/database/PWD%ORACLE_SID%.ora password=sys entries=5
orapwd
注释:271338.1
1.Ensure REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE is set in the init.ora for the database
密码文件是有格式的
2.Create a password file:
Unix: $ orapwd file=$ORACLE_HOME/dbs/orapwd$ORACLE_SID password=sys entries=5
Windows: C:/> orapwd file=%ORACLE_HOME%/database/pwd%ORACLE_SID% password= sys entries=5

3. grant sysdba to sys;
4. alter user sys identified by sys; --重新修改下密码

move table/index/lob column/partiton table/partiton index

-- purge recyclebin
purge user_recyclebin ;
-- move table to dest_data
select 'alter table '||segment_name||' move tablespace
dest_data ;' from user_segments where segment_type='TABLE';
-- move index to
dest_data
select 'alter index '||segment_name||' rebuild tablespace dest_data ;' from user_segments where segment_type='INDEX';
-- move lob column
select 'alter table '||table_name||' move lob ('||column_name||') store as (tablespace
dest_data) ;' from user_lobs ;
-- move partition table
select 'alter table '||table_name||' move partition '||partition_name||' tablespace
dest_data ;' from user_tab_partitions ;
-- move partiton index
select 'alter index '||index_name||' rebuild partition '||partition_name||' tablespace
dest_data ;' from user_ind_partitions ;

2012年7月17日星期二

Oracle连接MySQL-使用DG4ODBC.

Oracle连接MySQL-使用DG4ODBC.

最近做了一次Oracle连接到MySQL的实验,主要是通过DG4ODBC来连接的.以下是实验环境和实验步骤.
Oracle服务器:
IP:192.168.0.193
Database Version:11.2.0.1
MySQL服务器
IP:192.168.0.100
MySQL Version:5.5.18
1.首先要检查Oracle和DG4ODBC是32位还是64位.
[oracle@11g ~]$ file $ORACLE_HOME/bin/dg4odbc
/oracle/app/oracle/product/11.2.0/db_1/bin/dg4odbc: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
这里可以看到是64位的.所以必须使用64位的ODBC Driver Manager和64位的ODBC Driver.
2.下载并安装64位的ODBC Driver Manager UnixODBC 2.2.14.
下载地址:http://sourceforge.net/projects/unixodbc/files/unixODBC/2.2.14/unixODBC-2.2.14-linux-x86-64.tar.gz/download
#这里下载到了/home/oracle目录下面
[oracle@11g ~]$ ls -l unixODBC*
-rw-r--r-- 1 oracle dba 756418 Dec 13 18:17 unixODBC-2.2.14-linux-x86-64.tar.gz
[oracle@11g ~]$ mkdir -p ~/app/unixodbc-2.2.14
[oracle@11g ~]$ cd ~/app/unixodbc-2.2.14/
[oracle@11g unixodbc-2.2.14]$ gunzip -c ~/unixODBC-2.2.14-linux-x86-64.tar.gz | tar xvf -
#因为UnixODBC的包lib和bin是在/usr/local文件夹里面.为了方便其见,我们把他们移动到上层目录上来.
[oracle@11g unixodbc-2.2.14]$ mv ~/app/unixodbc-2.2.14/usr/local/* .
[oracle@11g unixodbc-2.2.14]$ rm -rf usr/
#检查一下目录的内容
[oracle@11g unixodbc-2.2.14]$ ls -l
total 12
drwxr-xr-x 2 oracle oinstall 4096 Nov 20 2008 bin
drwxr-xr-x 2 oracle oinstall 4096 Nov 20 2008 include
drwxr-xr-x 2 oracle oinstall 4096 Nov 20 2008 lib
3.下载并安装ODBC Driver
下载地址:http:http://ftp.ntu.edu.tw/pub/MySQL/Downloads/Connector-ODBC/5.1/
#这里下载到了/home/oracle目录下面
[oracle@11g ~]$ ls -l mysql-connector-odbc-5.1.8-linux-glibc2.3-x86-64bit.tar.gz
-rw-r--r-- 1 oracle oinstall 5725402 Dec 14 22:40 mysql-connector-odbc-5.1.8-linux-glibc2.3-x86-64bit.tar.gz
[oracle@11g ~]$ cd app/
[oracle@11g app]$ gunzip -c ~/mysql-connector-odbc-5.1.8-linux-glibc2.3-x86-64bit.tar.gz | tar xvf -
[root@11g app]# ln -s mysql-connector-odbc-5.1.8-linux-glibc2.3-x86-64bit myodbc-5.18
4.配置MYSQL Connector(ODBC driver)
首先在mysql服务器上新建一个用户,并建相关的表
mysql> grant all privileges on test.* to mysql_user@localhost identified by "mysql_user";
Query OK, 0 rows affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table t (id int);
Query OK, 0 rows affected (0.09 sec)
mysql> insert into t values (20);
Query OK, 1 row affected (0.04 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
然后在Oracle所在的服务器上面的/oracle/home/app下面建立odbc.ini文件,添加加以下内容
[myodbc5]
Driver = /home/dbs/app/myodbc-5.18/lib/libmyodbc5.so
Description = Connector/ODBC 5.1 Driver DSN
SERVER = 192.168.0.100
PORT = 3306
USER = mysql_user
PASSWORD = mysql_user
DATABASE = test
OPTION = 0
TRACE = OFF
5.使用isql来进行验证
[oracle@11g ~]$ export ODBCINI=/home/oracle/app/odbc.ini
[oracle@11g ~]$ export LD_LIBRARY_PATH=/home/oracle/app/unixodbc-2.2.14/lib:$LD_LIBRARY_PATH
[oracle@11g bin]$ ./isql myodbc5 -v
[S1000][unixODBC][MySQL][ODBC 5.1 Driver]Can't connect to MySQL server on '192.168.0.100' (113)
[ISQL]ERROR: Could not SQLConnect
这里报错.这是因为mysql新建的mysql_user用户不允许其他ip访问.切换到mysql服务器上面进行检查.
[root@buddy ~]# mysql --user=mysql_user --password=mysql_user --host=192.168.0.100 --port=3306
ERROR 1130 (HY000): Host '192.168.0.100' is not allowed to connect to this MySQL server
进入数据库查询可以清楚的看到只有localhost才能访问mysql_user;
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select host,user from user;
+-----------+------------+
| host      | user       |
+-----------+------------+
| 127.0.0.1 | root       |
| ::1       | root       |
| buddy     |            |
| buddy     | root       |
| localhost |            |
| localhost | mysql_user |
| localhost | root       |
+-----------+------------+
7 rows in set (0.00 sec)
#修改权限.
mysql> grant all privileges on test.* to 'mysql_user'@'%' identified by 'mysql_user';
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user from user;
+-----------+------------+
| host      | user       |
+-----------+------------+
| %         | mysql_user |
| 127.0.0.1 | root       |
| ::1       | root       |
| buddy     |            |
| buddy     | root       |
| localhost |            |
| localhost | mysql_user |
| localhost | root       |
+-----------+------------+
8 rows in set (0.00 sec)
如果还是不行,就需要把mysql服务器的防火墙关闭.
[root@buddy init.d]# /etc/init.d/iptables stop
然后切换到oracle服务器上执行isql命令测试
[oracle@11g bin]$ ./isql myodbc5 -v
+----------------------+
| Connected!           |
|                      |
| sql-statement        |
| help [tablename]     |
| quit                 |
|                      |
+----------------------+
SQL> show tables;
+----------------------+
| Tables_in_test       |
+----------------------+
| t                    |
+----------------------+
SQLRowCount returns 1
1 rows fetched
6.配置tnsnames.ora文件,增加下列内容.
myodbc5=
(DESCRIPTION=
(ADDRESS=(PROTOCOL = TCP) (HOST = 192.168.0.193) (PORT = 1521))
(CONNECT_DATA =
(SID = myodbc5)
)
(HS=OK)
)
7.配置listenner.ora文件,增加下列内容.
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=myodbc5)
(ORACLE_HOME=/oracle/app/oracle/product/11.2.0/db_1)
(PROGRAM=dg4odbc)
(ENVS=LD_LIBRARY_PATH=/home/oracle/app/unixodbc-2.2.14)
)
)
8.配置静态监听,初始化参数文件.initmyodbc5.ora
[oracle@11g ~]$ vi $ORACLE_HOME/hs/admin/initmyodbc5.ora
#加入下列内容
[注意]:HS_FDS_CONNECT_INFO是Data Source的名字.这个名字是odbc.ini文件里面定义的.
HS_FDS_CONNECT_INFO=myodbc5 # Data source name in odbc.ini
# HS_FDS_TRACE_LEVEL=user
HS_FDS_SHAREABLE_NAME=/home/oracle/app/unixodbc-2.2.14/lib/libodbc.so
HS_FDS_SUPPORT_STATISTICS=FALSE
HS_LANGUAGE=AMERICAN.AMERICA.ZHS16GBK
# ODBC env variables
set ODBCINI=/home/oracle/app/odbc.ini
9.重启监听,让刚才修改的文件生效.
[oracle@11g ~]$ lsnrctl stop
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 15-DEC-2011 19:50:34

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.193)(PORT=1521)))
The command completed successfully
[oracle@11g ~]$ lsnrctl start

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 15-DEC-2011 19:50:45

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Starting /oracle/app/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /oracle/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Log messages written to /oracle/app/oracle/diag/tnslsnr/11g/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.193)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.193)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 15-DEC-2011 19:50:45
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/11g/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.193)(PORT=1521)))
Services Summary...
Service "myodbc5" has 1 instance(s).
Instance "myodbc5", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
重启监听之后,可以看到myodbc5已经注册上了,但是状态是UNKNOWN,这种情况是正常的.因为我们还没有尝试使用该服务,最后尝试去TNSPING一下.看看能不能ping通.
[oracle@11g admin]$ tnsping myodbc5
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 15-DEC-2011 20:00:10

Copyright (c) 1997, 2009, Oracle. All rights reserved.

Used parameter files:

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL = TCP) (HOST = 192.168.0.193) (PORT = 1521)) (CONNECT_DATA = (SID = myodbc5)) (HS=OK))
OK (0 msec)
10.创建Database Link.
[oracle@11g admin]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Thu Dec 15 20:02:16 2011

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create public database link myodbc5 connect to "mysql_user" identified by "mysql_user" using 'myodbc5';

Database link created.

SQL> select * from "t"@myodbc5;

id
----------
20
[注意]:当通过Link查询mysql的表,推荐在命名使用双引号,除非MySQL Server上设置了ANSI_QUOTES.
至此.Oracle已经能够正常通过DG4ODBC连接到MySQL了.

How To Access MySQL from Oracle With ODBC and SQL

The Oracle gateway for ODBC provides an almost seamless data integration between Oracle and other RDBMS. I won’t argue about its performance, limits, or relevance. It serves a few purposes; set it up and you’ll be able, for example, to create database links between Oracle and MySQL. After all, wouldn’t it be nice if you could run some of the following SQL statements?
  • select o.col1, m.col1 from oracle_tab
    o, mysql_tab@mysql m where o.col1=m.col1;
  • insert into oracle_tab (select * from mysql_tab@mysql);
This post is intended to share, the same way Karun did it for SQL Server last year, some tips related to the setup of the Oracle Gateway for ODBC with MySQL Connector ODBC on Linux.

Prerequisites

I’ve installed all the configuration on my laptop to test it. It’s running Ubuntu Intrepid Ibex 32bits, but I won’t dig into the challenge of installing the MySQL Connector ODBC 5.1 on it. All I’ll tell you is that, if I understand correctly, the version of iodbc that comes with Intrepid doesn’t support MySQL Connector ODBC 5.1 too well, and the messages that it returns are not quite explicit. To be frank, what I did is put that monkey on Augusto’s back. He sorted out everything in a few minutes. I guess I have to thank Augusto twice, just for this post! I’ve also followed his “Installing Oracle 11gR1 on Ubuntu 8.10 Intrepid Ibex” post to install the Oracle part.
But let’s talk about the prerequisites! You need to have installed and configured the following components:

Creating a MySQLDEMO database, user and table

For the purpose of the demonstration, I’ve created a database, a user and a table named DEMO with the mysql client. You’ll find the script below.
Important Note:
The gateway for ODBC doesn’t look to work correctly when data are stored in utf8 in MySQL, whether or not the Connector/ODBC does the transformation into a non-utf8 character set. For this reason, I set the MySQL database default character set to latin1. I suspect somehow the issue is related to the ODBC driver: if I use latin1 on the client side, Oracle should not see any difference, whatever the storing character set is. Anyway, there is also a limitation on the Oracle side, and it doesn’t handle utf8 correctly with the Connector (see MySupport note 756186.1)
$ mysql -uroot -p

create database demo character set latin1;
grant all privileges on demo.* to 'demo'@'localhost'
   identified by 'demo' with grant option;
flush privileges;
exit;

$ mysql -udemo -pdemo -Ddemo

create table demo (
   col1 integer,
   col2 date,
   col3 varchar(10),
   col4 varchar(10) character set utf8,
   col5 varbinary(10)) engine innodb;

insert into demo(col1, col2, col3, col4, col5)
   values(1, cast(now() as date), '0123456789', '0123456789', '0123456789');

select * from demo \G

*********** 1. row ************
col1: 1
col2: 2009-03-11
col3: 0123456789
col4: 0123456789
col5: 0123456789

exit;

Creating an ODBC DSN to access the DEMO database

Once the database was created, I created a user DSN in the Oracle owner, so that the the listener can get it via the dg4odbc program. By default the file that store the user DSN is $HOME/.odbc.ini, but you can change it to any file/location that fits your needs. This is how the file looks like on my server:
$ cat ~oracle/.odbc.ini
[ODBC Data Sources]
demo = MySQL ODBC Driver 5.1

[demo]
Driver      = /home/oracle/mysql515/lib/libmyodbc5.so
DATABASE    = demo
DESCRIPTION = MySQL ODBC 5.1.5 Connector Sample
PORT        = 3306
SERVER      = 127.0.0.1
# UID         = demo
# PWD         = demo
CHARSET     = latin1
TRACEFILE   = /tmp/myodbc-demodsn.trc
TRACE       = OFF
Make sure the CHARSET parameter is set so that it doesn’t use utf8.

Configuring dg4odbc to use the DSN

dg4odbc gets its settings from a file named init[SID].ora located in $ORACLE_HOME/hs/admin. In this case, SID is an arbitrary parameter we’ll configure in the listener.orafile (see next section). I’ve used SID=mysql for this demo, and the initmysql.ora file looks like the one below:
$ cat $ORACLE_HOME/hs/admin/initmysql.ora
#
# HS init parameters
#
HS_FDS_CONNECT_INFO=demo
HS_FDS_TRACE_LEVEL=0
HS_FDS_SHAREABLE_NAME=/home/oracle/mysql515/lib/libmyodbc5.so
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P15
# HS_NLS_NCHAR=AL32UTF8
#
# ODBC specific environment variables
#
set ODBCINI=/home/oracle/.odbc.ini
set LD_LIBRARY_PATH=/home/oracle/mysql515/lib

#
# Environment variables required for the non-Oracle system
#
set HOME=/home/oracle
As you can see above:
  • ODBCINI is the location odbc.ini the file.
  • HS_FDS_CONNECT_INFO points to the right DSN.
  • HS_FDS_SHAREABLE_NAME points to ODBC driver shared library.
  • HS_LANGUAGE is set to avoid the problem described in Oracle MySupport “756186.1: Error Ora-28500 and Sqlstate I Issuing Selects From a Unicode Oracle RDBMS With Dg4odbc To Mysql”.

Configuring the listener

To configure the listener, I had to change the listener.ora file to add the SID defined in the previous section and associate it with the gateway for ODBC; here is a copy of my setup used; I’ve kept all the settings (host, port, dynamic registration) default:
$ cat $ORACLE_HOME/network/admin/listener.ora

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1)
      (SID_NAME = mysql)
      (PROGRAM = dg4odbc)
      (ENVS ="LD_LIBRARY_PATH=/home/oracle/mysql515/lib:/usr/lib:$ORACLE_HOME/lib")
    )
  )
Once the listener is setup, you can bounce or reload it; if it’s not started, just start it:
$ lsnrctl start
And add an entry in the listener.ora file like the one below; make sure you’ve added HS=OK and that it’s not in the CONNECT_DATA clause:
MYSQL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)
                 (HOST = localhost)
                 (PORT = 1521)
      )
    )
    (CONNECT_DATA =
      (SID = mysql)
    )
    (HS = OK)
  )

Creating a database link to connect to MySQL from Oracle

At this point, and after a little debugging of the different layers, I was able to create a database link from Oracle to MySQL. To do so, I connected to Oracle and used the CREATE DATABASE LINK command:
$ sqlplus / as sysdba

create database link mysql
  connect to "demo"
  identified by "demo"
  using 'mysql';

select "col3" from "demo"@mysql;

col3
---------------------------------
0123456789
Note:
The case policy differs between Oracle and MySQL, and you must
always surround the table and columns name with double quotes.

Using the Gateway for ODBC

If you remember correctly, I stored the string “0123456789″ in col3, col4, and col5. You’ll see some of the issues with the character set by querying a datum stored in utf8:
select "col4" from "demo"@mysql;

col4
----------------------------------------
0 1 2 3 4
and one stored in a varbinary:
select "col5" from "demo"@mysql;

col5
--------------------
30313233343536373839
But you’ll also be able to enjoy some of the features of your new Oracle/MySQL integrated environment, and be able to create a table in Oracle using data from MySQL:
create table demo as
  select "col1" col1, "col2" col2, "col3" col3
    from "demo"@mysql;

select * from demo;

COL1 COL2      COL3
---- --------- ----------
   1 11-MAR-09 0123456789
Unfortunately, you cannot insert data directly from Oracle into MySQL with an insert as select:
insert into "demo"@mysql("col1").
  select 2 from dual;

ERROR at line 2:
ORA-02025: all tables in the SQL statement must be at the remote database
But you can workaround that issue with some PL/SQL (I’m not saying it’s efficient):
begin
  for i in (select col1, col2, col3 from demo) loop
     insert into "demo"@mysql("col1","col2", "col3")
       values (2,i.col2, i.col3);
  end loop;
end;
/

select "col1","col2", "col3"
  from "demo"@mysql;

col1 col2      col3
---- --------- ----------
   1 11-MAR-09 0123456789
   2 11-MAR-09 0123456789
To prevent the access to MySQL from Oracle, you can drop the database link:
drop database link mysql;
That is it. It works pretty well so far and, despite the limits of such an approach, it can be quite useful for those that want to migrate from MySQL to Oracle.

2012年7月12日星期四

让Linuxt和oracle显示中文

一、对于linux 如下:
修改服务器端语言环境,将i18n里的信息修改成以下代码
vi /etc/sysconfig/i18n
1. LANG="zh_CN.GB18030"
2. LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
3. SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
4. SYSFONT="lat0-sun16"
重新登录终端后再显示字符编码# echo $LANGzh_CN.GB18030以上这两种方法即可解决windows上传文件到linux在终端显示乱码问题。
然后安装中文字库,我的安装盘共有5张,这两个字库是在第4张盘中,文件名分别是:fonts-chinese-3.02-9.6.el5.noarch.rpm和fonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm。装完不用重启就显示正常了。
我在安装字体的时候rpm -ivh fonts-chinese-3.02-12.el5.noarch.rpm
rpm -ivh fonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm
安装完毕重启!
二、对于oracle 修改oracle用户的.bash_profile环境变量文件:
 
1、以root登录,设置linux系统语言为中文,即zh_CN(可在/etc/sysconfig/i18n文件中修改,当然前提是你需要有中文的安装包);设置完毕之后需要重启(远程登录的话好像只能重启了)或者按ctrl+alt+backspace组合键,使语言设置生效。
之所以设置系统语言为中文,是为了我们用客户端(比如secureCRT工具)登录服务器的时候可以显示中文,以验证oracle的正确。
2、以oracle用户登录编辑家目录下的.bash_profile文件,在其后添加 export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" #for 中文
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
nls_lang是数据库的字符集变量,默认的为AMERICAN
3、以sysdba来修改数据库的字符集,步骤如下:
SQL> conn /as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 236000356 bytes
Fixed Size 451684 bytes
Variable Size 201326592 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
SQL> ALTER SESSION SET SQL_TRACE=TRUE;//语句跟踪
System altered.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

System altered.

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

System altered.

SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;

System altered.

SQL> alter database open;

Database altered.

SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set


提示我们的字符集:新字符集必须为旧字符集的超集,这时我们www.linuxidc.com可以跳过超集的检查做更改:

SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

Database altered.
查看字符集是否改变:
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

Database altered.

SQL> select * from v$nls_parameters;

PARAMETER VALUE
---------------------------------------------------------------- ---------------
NLS_LANGUAGE ZHS16GBK ——已经改变,之前为AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM

PARAMETER VALUE
---------------------------------------------------------------- ---------------
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI
NLS_DUAL_CURRENCY $
NLS_NCHAR_CHARACTERSET UTF8
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE

19 rows selected.
重启刷新再检查一次:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 236000356 bytes
Fixed Size 451684 bytes
Variable Size 201326592 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
SQL> select * from v$nls_parameters;

PARAMETER VALUE
---------------------------------------------------------------- ---------------
NLS_LANGUAGE ZHS16GBK
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM

PARAMETER VALUE
---------------------------------------------------------------- ---------------
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI
NLS_DUAL_CURRENCY $
NLS_NCHAR_CHARACTERSET UTF8
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE

19 rows selected.

4、最后导入.dmp文件
$imp test/test1234
____________________________________________________________________________________导入的提示信息
Import file: expdat.dmp > mydata.dmp
Enter insert buffer size (minimum is 8192) 30720>
Export file created by EXPORT:V11.02.00 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
List contents of import file only (yes/no): no >
Ignore create error due to object existence (yes/no): no >
Import grants (yes/no): yes >
Import table data (yes/no): yes >
Import entire export file (yes/no): no > yes
—————————————————————————————————————————————————
上述步骤完成之后,如果在1.120服务器中运行select语句之后出现乱码(其实已经和之前出现?有很大的区别了,之所以出现乱码是因为终端字符集默认为UTF-8,我们可以更改linux下terminal的字符集为GBK登录试试看是否还有乱码出现),这时候也可以用客户端工具 secureCRT以oracle用户登录192.168.1.120服务器,并设置后客户端的字符编码为简体中文,进行select语句查看,显示出来的就是中文了。这即是说,往数据表中插入数据的时候可以用客户端工具来完成。

2012年7月9日星期一

Oracle表和索引移动表空间

-----------------------------对表进行表空间移动操作-----------------------------
如果有一张表ACCOUNTS存放在表空间EXAMPLE
现在要把表ACCOUNTS移动到表空间DEMO下,该怎么操作?
操作语句如下:
ALTER TABLE ACCOUNTS MOVE TABLESPACE DEMO;
COMMIT;

ACCOUNTS表的结构和数据会一起被移动到表空间demo下。
如果要把表空间example下的所有表全部移动到表空间demo下该怎么操作?
操作语句如下:
SELECT 'ALTER TABLE '||TABLE_NAME||' MOVE TABLESPACE DEMO;
COMMIT;' FROM USER_TABLES WHERE TABLESPACE_NAME='EXAMPLE';

-----------------------------对索引进行表空间移动操作--------------------------
如果ACCOUNTS表上有索引BMI_ACCOUNTS,ACCOUNTS被移动到表空间demo后,
其索引BMI_ACCOUNTS并不会自动被移动到表空间DEMO中。
移动索引的表空间改怎么操作?
ALTER INDEX BMI_ACCOUNTS REBUILD TABLESPACE DEMO;
COMMIT;

如果要把表空间EXAMPLE下的所有索引移动到表空间DEMO下该怎么操作?
操作语句如下:
SELECT 'ALTER INDEX '||INDEX_NAME||' REBUILD TABLESPACE DEMO;
COMMIT;' FROM USER_INDEXES WHERE TABLESPACE_NAME='EXAMPLE';

2012年7月6日星期五

关于recover database using backup controlfile与until cancel

1. recover database using backup controlfile

/p7T Y j-@+g$B L0 如果丢失当前控制文件,用冷备份的控制文件恢复的时候,用来告诉oracle,不要以controlfile中的scn作为恢复的终点;
2. recover database until cancel
如果丢失current/active redo的时候,手动指定终点。
3. recover database using backup controlfile until cancel;
如果丢失当前controlfile并且current/active redo都丢失,会先去自动应用归档日志,可以实现最大的恢复;
4. recover database until cancel using backup controlfile;
如果丢失当前controlfile并且current/active redo都丢失,以旧的redo中的scn为恢复终点。因为没有应用归档日志,所有会丢失数据。
ITPUB个人空间 G v,L I1A \
要理解recover database using backup controlfile,先理解 recover database,也就是说,不加using backup controlfile的情况。
在普通的recover database 或者 recover tablespace, recover datafile时, Oracle会以当前controlfile所纪录的SCN为准,利用archive log和 redo log的redo entry, 把相关的datafile 的 block恢复到“当前controlfile所纪录的SCN”

2i O&F X.S s s ]*\"F6Q0而某些情况下,Oracle需要把数据恢复到比当前controlfile所纪录的SCN还要靠后的位置(比如说,control file是backup controlfile , 或者 controlfile是根据trace create的。),这时候,就需要用using backup controlfile. 恢复就不会受“当前controlfile所记录的SCN”的限制。这时候的限制就来自于你的语句(until time , until scn),或者可用的archive log(until cancel) ...

2012年6月28日星期四

nmon 监控

一、介绍

Nmon 工具是 IBM 提供的免费的在AIX与各种Linux操作系统上广泛使用的监控与分析工具。该工具可将服务器的系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工具nmonanalyser进行数据的统计分析。并且,nmon运行不会占用过多的系统资源,通常情况下CPU利用率不会超过2%。针对不同的操作系统版本,nmon有相应版本的程序。分别依次按c,m,t会分别显示相应信息。

以下介绍AIX版本下的nmon的使用

二、安装

首先下载 nmon 工具,下载时需注意要下载对应的系统版本。我们这里以 AIX 为例,下载的是nmon4aix_11e.tar.gz 版本。下载后解压nmon4aix_11e.tar.gz(里面包含README_v11.txt、nmon_aix51、nmon_aix52ml5、nmon、nmon_aix52ml2nmon_aix53),将文件夹名改为 nmon 并上传到 Linux 中(任何一个文件夹下均可以)。

为了能够正常的使用 nmon 工具,我们需要修改相关文件的权限。

tbcs@BOSS1:/interface/interface/nmon$chmod 755 nmon nmon_aix51nmon_aix52ml2 nmon_aix52ml5 nmon_aix53
1.jpg


现在可以使用nmon了。

Nmon工具使用比较简单,在nmon 目录下,输入 ./nmon
2.jpg

出现此画面,说明已安装成功。(这是AIX版本的画面,其他版本画面会稍有不同)

输入c可显示CPU的信息,“m”对应内存、“n”对应网络,“d”可以查看磁盘信息;“t”可以查看系统的进程信息;“
3.jpg


三、数据采集

以上实现的是对服务器的实时监控,在实际的性能测试中我们需要把一段时间之内的数据记录下来,可以使用如下命令

./nmon –f –t –r test –s 30 –c 10

上面命令的含义是:

-f :按标准格式输出文件名称:<hostname>_YYYYMMDD_HHMM.nmon

-t 输出最耗资源的进程
-s :每隔n秒抽样一次,这里为30秒
-c :取出多少个抽样数量,这里为10,即监控=10*30/60=5分钟

test:监控记录的标题

该命令启动后,会在nmon所在目录下生成监控文件,并持续写入资源数据,直至360个监控点收集完成——即监控1小时,这些操作均自动完成,无需手工干预,测试人员可以继续完成其他操作。如果想停止该监控,需要通过“#ps –ef|grep nmon”查询进程号,然后杀掉该进程以停止监控。

nmon 输出文件的命名方式是服务器名_日期时间.nmon

通过以下命令,将.nmon文件转化成.csv文件,在当前目录生成对应的.csv文件

sort BOSS1_110810_1438.nmon>BOSS1_110810_1438.csv

4.jpg


将BOSS1_110810_1438.csv文件下载到本地。通过nmon analyser工具( nmon analyser v33g.xls)转化为excel文件。如何转化呢?步骤如下:

1) 下载后打开nmon analyser v33g.xls

2) 调整excel宏的安全级别,调整为最低或者如下操作

5.jpg


3) 然后点击Analyser nmon data 按钮,选择下载下来的.csv文件,然后就会转化成.excel文件,生成图形化的文件,例如:
6.jpg
7.jpg

2012年6月27日星期三

11g数据导入到10g

用exp、imp命令时进行11g备份,导入10g的时候会抛错:不是有效的导出文件,头部验证失败;未成功终止导入。

实验步骤如下:

一、在11g服务器上,使用expdp命令备份数据

EXPDP USERID='SYS/abc@metar as sysdba' schemas=oa directory=DATA_PUMP_DIR dumpfile=dag.dmp logfile=dag.log version=10.2.0.1.0

例如我的sys密码是abc,数据库sid是metar,要导出的用户名是oa,要导入到10.2.0.1.0版本的Oracle数据库中去。aa.dmp和aa.log将会在11g的dpdump目录中生成,例如我的11g装在了D盘下面,于是dag.dmp将会在D:/app/Administrator/admin/cuc/dpdump目录下被生成。

二、在10g服务器上,使用impdp命令恢复数据

步骤:1.建库2.建表空间3.建用户并授权4.将dag.dmp拷贝到10g的dpdump目录下5.impdp导入数据库
1、建库:是在database configuration assistant 中直接新建一个数据库(实例)。
2、建表空间:create tablespace OA datafile 'D:\oracle\product\10.2.0\oradata\orcl\oa.dbf' size 400m autoextend on next 20m online;
3、建用户:
create user oa identified by oa;
授权:
Alter user OA default tablespace OA quota unlimited on OA;
grant create session to oa;
grant connect to oa;
grant connect, resource, dba to oa;
grant create table to oa;
grant create view to oa;
grant create trigger to oa;
grant select any table to oa;
grant create sequence to oa;
grant create procedure to oa;
grant create role to oa;
grant create type to oa;
grant GRANT ANY PRIVILEGE to oa;

4、创建目录:
sqlplus sys/abc@metar
sql>create directory dump_dir as 'C:\oracle\product\10.2.0\admin\daggis\udump';

IMPDP USERID='SYS/abc@metar as sysdba' schemas=oa directory=DATA_PUMP_DIR dumpfile=dag.dmp logfile=dag.log version=10.2.0.1.0
 
进行验证,在导出数据库的机器运行一次,在导入数据库后的机器运行一次,看看结果是否一样:sql>select count(*) from dba_objects where owner in ('xxx','xxx','xxx');

2012年6月26日星期二

sqluldr2在linux上运用

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
         
PATH=$PATH:$HOME/bin
         
export PATH
export ORACLE_SID=orcl
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export PATH=$ORACLE_HOME/bin:$PATH:$ORACLE_HOME/lib
export NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

[oracle@localhost sqluldr]$ ./sqluldr2_linux64_10204.bin cm_dsa/cm_dsa query=ds_clt_abis_ho field=, file=/oradata/cm_dsadump/ds_clt_abis_ho.csv text=CSV

ASM概念以及管理

一、关于oracle ASM实例的概念:
      ASM 实例与 ORACLE 实例差不多,都是 由 sga 和一堆后台进程组成,从功能上来看,区别在于oracle实例管理的是数据库,而asm实例只是管理asm盘阵。
通过Oracle EM或DBCA都可以对asm进行一些配置,不过三思觉着管理asm括弧实例的最佳工具仍是sql*plus,在进入sql*plus前也需要设置ORACLE_SID的环境变量,该环境变量通常是+ASM[node#] 。
ASM 实例没有数据字典之类的东东存储用户系统,因此最常见的连接认证方式就是操作系统认证as sysdba进入(OSDBA组的用户)。如果是通过远程连接的话( 比如远程通过tnsnames或OEM管理),也可以使用密钥文件进行验证,该密钥文件直数据库的密钥文件在命名规则及使用规则上完全一模一样。如果使用dbca建库的话,默认就会创建asm的密钥文件,当然也可以自行手动通过orapwd命令进行创建,与数据库的密钥文件有所不同的是,asm 的密钥文件对应的用户只有一个----sys。
二、启动和关闭oracle实例:
前些日子,装完oralce配置完asm后一切正常,当重新启动后就发现了oracle起不来,报如下错误:
ORA-01078: failure in processing system parameters 
ORA-01565: error in identifying file '+ORADATA/db01/spfiledb01.ora' 
ORA-17503: ksfdopn:2 Failed to open file +ORADATA/db01/spfiledb01.ora 
ORA-15077: could not locate ASM instance serving a required diskgroup
检查了一下,并非'+ORADATA/db01/spfiledb01.ora'文件不存在,而是由于ASM磁盘组没起来导致的。启动asm磁盘组有两种方法,一是使用dbca工具,二是从命令行启动。
1、dbca启动:
当启动dbca后,在出现的画面上选择 “Configure Automatic Storage Management”选项,下一步,就会启动ASM磁盘组并挂载磁盘组。
image
2、命令行启动:
首先要知道asm实例名,否则只能从DBCA启动了。这里的实例名是+ASM,操作如下:
在执行之前注意别忘了先设置操作系统环境变量ORACLE_SID。
image
现在已经启动到nomount状态了,查看磁盘组状态,可以使用以下命令查看:
image
查看ASM实例名:
image
ASM 实例与DB实例高度相似,启动和停止实例的命令也一模一样,就启动来说,也同样拥有 NOMOUNT/MOUNT/OPEN /FORCE 几种状态。
  • NOMOUNT :仅启动实例;
  • MOUNT 、OPEN:启动实例并加载磁盘,注意加载的是磁盘组(如果当前未创建或配置任何磁盘组,则提示敬告信息),OPEN,选项对于ASM实例无意义等同于MOUNT。
  • FORCE :相当于先执行shutdown abort,然后再startup。
使磁盘组处于mount状态:
image
查看磁盘组状态:
image
使用ps -ef|grep ora可以查看asm进程:
image
到此,就可以正常启动oracle数据库实例了:
image 
在oracle 10g版本中,ASM是依赖于CSS守护进程的,因此在启动ASM 实例前要确保css守护进程已经启动。CSS(Cluster Synchronization Services) 守护进程 用来维持ASM 及客户端数据库实例间的一致性 同步,如果是通过dbca建库的话,那么CSS守护进程默认即会启动(跟随系统reboot)。
检查css守护进程是否启动非常简单 ,直接使用crsctl check cssd即可,如果启动的话会收到"CSS appears healthy"的返回消息:
image
关闭ASM实例:
NORMAL/IMMEDIATE/TRANSACTIONAL/ABORT几个选项的定义与关闭普通数据库实例完全一模一样。
如果oracle数据库实例开启了,关闭asm实例时会报如下错误:
image
关闭oracle数据库实例后才能关闭ASM实例。
image
三、ASM实例的初始化参数:
ASM 实例的初始化参数形式上与数据库的初始化参数相同,也分spfile和pfile,操作方式也完全相同,只不过具体的参数及参数值略有差异,大多数数据库的初始化参数在这里也能见到,并且某些参数意义都完全相同,同样也有一些参数虽然见到了,不过并不需要设置,这个可以理解,毕竟asm只有实例,相对比数据库的初始化参数要简单的多了,还有一些参数则是数据库初始化参数中没有的。比如ASM开头的那几个初始化参数,这里把差异的部分都列出说明。
ASM 实例在内存占用这块还是比较轻量级的,基本上有个100m空间就很充足了 ,因此内存这块相关参数就不说了,下面说说几个ASM实例特别需要的参数。
首先,初始化参数中的INSTANCE_TYPE,该参数必须被设置为ASM(见粉红色部分):
+ASM.asm_diskgroups='ORADATA'#Manual Mount 
*.asm_diskgroups='ORADATA' 
*.background_dump_dest='/u01/app/oracle/admin/+ASM/bdump' 
*.core_dump_dest='/u01/app/oracle/admin/+ASM/cdump' 
*.instance_type='asm' 
*.large_pool_size=12M 
*.remote_login_passwordfile='SHARED' 
*.user_dump_dest='/u01/app/oracle/admin/+ASM/udump'
标识要启动的实例是ASM,而不是数据库实例(数据库实例对应类型为RDBMS)。
与ASM相关的初始化参数有三个:
  • ASM_POWER_LIMIT :指定磁盘rebalance的程度,有0-11个级别,默认值为1,指定的级别越高,则rebalance的操作就会越快被完成(当然这也意味着这个时间段内将占用更多的资源),指定级别较低的话,虽然rebalance操作会耗时更久,但对当前系统的IO及负载影响会更少,这中间的度需要DBA根据实际情况衡量。另外,这个参数指定的只是一个默认值,在操作过程中,即可以随便动态修改,也可以在语句级命令行时指定power,覆盖该默认值。
  • ASM_DISKSTRING :用最简单的话说,就是设置ASM启动时检查的磁盘,该选项可以同时指定多个值,并且支持通配符。比如说,只检查/dev/dsk/下的设备,可以设置该参数如下:/dev/dsk/*,默认情况下该参数为空,为空的话,表示ASM将查找系统中所有ASM拥有读写权限的设备。
  • ASM_DISKGROUPS :指定实例启动或alter diskgroup all mount语句时要加载的磁盘组,如果为空的话,那么实际就仅启动到NOMOUNT状态了。如果是使用SPFILE的话,该参数一般不需要手动修改,ASM能够自动更新该初始化参数中的值。
    修改 ASM 实例初始化参数文件的命令规则与数据库初始化参数完全相同 ,例如:
image
四、管理ASM磁盘:
ASM 磁盘组的管理方式呢也比较多,比如像DBCA、EM、SQL*PLUS等均可操作(不同工具 易用性不同,不过 功能也有差异),除此之外ORACLE还专门提供了ASMCMD命令行方式,像操作文件系统一样来操作磁盘组。本节操作主要使用sql*plus命令行工具,关于asmcmd命令行中的命令,以后再说。
在管理ASM之前不得不提与ASM相关的动态性能视图,这些视图将对我们后面的操作起到重要作用,查询数据库中ASM相关视图可以通过下列SQL语句:
image
这其中,V$ASM_ALIAS视图中记录文件别名信息,V$ASM_CLIENT返回当前连接的客户端实例信息,V$ASM_DISK*相关视图中记录的是ASM管理的磁盘及磁盘组信息,V$ASM_OPERATION记录当前磁盘的操作信息,例如:
image
image 
加或删除磁盘的影响
当发生添加/删除磁盘组中磁盘的操作时,ASM能够自动平衡。对于普通的删除操作(无force选项),被删除的磁盘在该上数据被有效处理前并不会立刻释放,同样,新增磁盘时,在重分配工作完成前,该盘也不会承担I/O负载的工作。
ASM 如何处理磁盘故障
ASM 中的磁盘组可以分成两类:普通磁盘组和failure磁盘组,后者又与ASM的冗余方式有所关联。普通磁盘组就是标准的存储单元,ASM可以向其可访问的磁盘组中读写数据,failure磁盘组是为了提高数据的高可用性。ASM中的磁盘冗余策略非常简单,概要成三类:外部冗余、标准冗余和高度冗余,其中前者与failure磁盘组无关,如果设置了后者,那么该磁盘组就必须拥有failure磁盘组。听起来像在说failure磁盘组是普通磁盘组的子集,其实差不多可以这么理解,外部冗余的话磁盘属于磁盘组,内部冗余的话,磁盘属于磁盘组的同时,还属于某个(并且只能是一个)failure磁盘组。
比如说对于标准冗余(Normal Redundancy),ASM要求该磁盘组至少要拥有两个failure磁盘组,即提供双倍镜像保护,对于同一份数据(ASM中镜像单位不是磁盘,也不是块,而是一种AU的单位,该单位大小默认是1M)将有主从两份镜像,并且ASM通过算法来自动确保主、从镜像不会存在于同一份failure磁盘组,这样就保障了就算整个failure磁盘组都损坏,数据也不会丢失。至于高度冗余(High Redundancy)就更安全了,它至少需要三个failure磁盘组,也就是一份AU有一主多从的镜像,理论上将更加安全。
如果磁盘发生损坏,那么损坏的磁盘默认自动offlice并被drop掉,不过该磁盘所在的磁盘组仍将保持MOUNT状态,如果该盘有镜像的话,那么应用不会有影响,镜像盘将自动实现接管--只要不是所有failure磁盘组都损坏掉,否则的话,该磁盘组将自动DISMOUNT。举个例子吧,某标准冗余的failure组有6个盘(对应6个裸设备),假如说此时坏了一块盘,没关系,操作继续,坏了那块会被自动dropped,剩下的5块盘仍然能够负担起正常的读写操作。
ASM 扩展性
  • 最多支持63个磁盘组;
  • 最多支持10000个磁盘;
  • 最大支持4pb/磁盘;
  • 最大支持40 exabyte/ASM存储;
  • 最大支持1百W个文件/磁盘组;
  • 外部冗余时单个文件最大35tb,标准冗余时单个文件最大5.8tb,高冗余度时单个文件最大3.9tb。