1、创建测试表
SQL> CREATE TABLE t_M
2 AS
3 SELECT * FROM all_objects;
Table created
2、查询测试表中记录
SQL> select count(*) from t_m;
COUNT(*)
———-
48941
3、创建中间表
SQL> create table t_m_n as
2 select * from t_m where 1=0;
Table created
4、查询中间表记录
SQL> select count(*) from t_m_n;
COUNT(*)
———-
5、创建刷新物化视图
SQL> CREATE MATERIALIZED VIEW t_m_n
on prebuilt TABLE WITH REDUCED PRECISION
REFRESH FORCE
ON DEMAND
AS
SELECT * FROM t_m;
Materialized view created
6、执行物化视图刷新
SQL> exec dbms_mview.refresh(‘T_M_N’);
PL/SQL procedure successfully completed
7、查询物化视图中记录数
SQL> select count(*) from t_m_n;
COUNT(*)
———-
48941
8、删除物化视图
SQL> DROP MATERIALIZED VIEW T_M_N;
Materialized view dropped
9、查询中间表中条数
SQL> select count(*) from t_m_n;
COUNT(*)
———-
48941
10、后续可能操作
1)t_m和t_m_n相互重命名,实现在线修移动表的位置、改表结构、降低高水位等操作,同(shrink)
2)和dblink结合,实现数据的跨版本迁移
集群服务启动与关闭(10g)
一、crs开启和关闭
关闭crs
/etc/init.d/init.crs stop
开启crs
/etc/init.d/init.crs start
二、启动和关闭所有的集群服务
关闭
./crs_stop -all
启动
./crs_start -all
三、分步操作crs服务
1、关闭集群
srvctl stop service -d
srvctl stop database -d
srvctl stop asm -n
srvctl stop asm -n
srvctl stop nodeapps -n
srvctl stop nodeapps -n
2、关闭集群
srvctl start nodeapps -n
srvctl start nodeapps -n
srvctl start asm -n
srvctl start asm -n
srvctl start database -d
srvctl start service -d
3、测试
3.1)关闭
srvctl stop service -d devdb -s XFF
srvctl stop instance -d devdb -i devdb1,devdb2 -o immediate
(srvctl stop database -d devdb -o immediate)
srvctl stop asm -n rac1
srvctl stop asm -n rac2
srvctl stop nodeapps -n rac1
srvctl stop nodeapps -n rac2
3.2)启动
srvctl start nodeapps -n rac1
srvctl start nodeapps -n rac2
srvctl start asm -n rac1
srvctl start asm -n rac2
srvctl start database -d devdb
(srvctl start instance -n devdb -i devdb1,devdb2)
srvctl start service -d devdb -s XFF
RAC维护命令
表在线重定义(无主键)
1、T2表结构
SQL> desc t2 Name Type Nullable Default Comments -------------- ------------- -------- ------- -------- OWNER VARCHAR2(30) Y OBJECT_NAME VARCHAR2(128) Y SUBOBJECT_NAME VARCHAR2(30) Y OBJECT_ID NUMBER Y DATA_OBJECT_ID NUMBER Y OBJECT_TYPE VARCHAR2(19) Y CREATED DATE Y LAST_DDL_TIME DATE Y TIMESTAMP VARCHAR2(19) Y STATUS VARCHAR2(7) Y TEMPORARY VARCHAR2(1) Y GENERATED VARCHAR2(1) Y SECONDARY VARCHAR2(1) Y
2、创建中间表
CREATE TABLE T2_1 AS SELECT * FROM t2 WHERE 1=0;
3、验证T2是否用于重定义(因没有主键,采用rowid实现)
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(user, 'T2', DBMS_REDEFINITION.cons_use_rowid);
4、执行表的在线重定义
EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T2', 'T2_1','OWNER OWNER, OBJECT_NAME OBJECT_NAME, SUBOBJECT_NAME SUBOBJECT_NAME, OBJECT_ID OBJECT_ID, DATA_OBJECT_ID DATA_OBJECT_ID, OBJECT_TYPE OBJECT_TYPE, CREATED CREATED, LAST_DDL_TIME LAST_DDL_TIME, TIMESTAMP TIMESTAMP, STATUS STATUS, TEMPORARY TEMPORARY, GENERATED GENERATED, SECONDARY SECONDARY',DBMS_REDEFINITION.cons_use_rowid);
说明:
1)采用单引号列出T2与T2_1表列的对应关系
2)列与列之间采用单引号分割,单引号后面要有空格
5、同步数据(可选)
exec dbms_redefinition.sync_interim_table(user, 'T2', 'T2_1');
6、执行结束在线定义过程
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(user, 'T2', 'T2_1');
7、删除中间表
drop table t2_1 purge;
8、处理T2表(删除隐藏列)
SQL> select col#,name,type# from SYS.COL$ WHERE OBJ#=(select object_id from dba_objects where object_name='T2'); COL# NAME TYPE# ---------- ------------------------------ ---------- 1 OWNER 1 2 OBJECT_NAME 1 3 SUBOBJECT_NAME 1 4 OBJECT_ID 2 5 DATA_OBJECT_ID 2 6 OBJECT_TYPE 1 7 CREATED 12 8 LAST_DDL_TIME 12 9 TIMESTAMP 1 10 STATUS 1 11 TEMPORARY 1 12 GENERATED 1 13 SECONDARY 1 0 SYS_C00014_11081015:39:40$ 1 --发现一个多余隐藏列SYS_C00014_11081015:39:40$,我们需要删除 SQL> alter table t2 set unused ("SYS_C00014_11081015:39:40$"); Table altered SQL> alter table t2 drop unused columns; Table altered
Oracle 10g RAC相关进程
Oracle Clusterware进程
OCSSD
该进程是Clusterware最关键进程,如果出现异常,会导致系统重启,该进程提供的服务为CSS(Cluster Synchronization Service)服务。CSS服务是通过多种心跳机制来实现实时监控集群的健康状态,提供脑裂保护等基础集群服务功能。CSS服务有两种心跳机制:一种是通过私有网络的Network Heartbeat,另一种是通过Voting Disk的Disk Heartbeat
CRSD
CRSD是实现“高可用(HA)”的主要进程,它所提供的服务叫做CRS(Cluster Ready Service)服务。该进程对Oracle Clusterware中的资源进行监控,并在这些资源运行异常时进行干预,包括关闭、重启进程或者转移服务。
EVMD
该进程负责发布CRS产生的各种事件(Event)
RACGIMON
该进程负责检查数据库的健康状态,负责Service的启动、停止、故障转移(Failover)。这个进程会建立到数据库的持久连接,定期检查SGA中的特定信息,该信息由PMON进程定时更新
OPROCD
该进程也叫做Process Monitor Daemon。如果在非Linux平台上,并且没有使用第三方的集群软件,会看到这个进程。实现“IO隔离”功能,在Liunx平台上,是利用hangcheck-timer模块来实现“IO隔离”功能
Oracle Instance进程
LMSn
负责数据块在实例间的传递,对应的服务叫作GCS(Global Cache Service),这个进程的数量是通过参数GCS_SERVER_PROCESSES控制,缺省值是2个,取值范围为0至9
LMD
负责在多个实例间协调数据库的访问顺序,保证数据的一致性访问,对应的服务是GES(Global Enqueue Service)
LCK
负责Non-Cache Fusion资源的同步访问,每个实例只有一个LCK进程
LMON
各个实例的LMON进程进行定期通信,以检查集群中各节点的健康状态,当某个节点出现故障时,负责集群重构、GRD恢复等操作,它提供的服务叫作 Cluster Group Services(CGS)
DIAG
监控实例的健康状态,并在实例运行出现错误时收集诊断数据记录到Alert.log日志中
GSD
负责从客户端工具接收命令,为用户提供管理接口
路走对了,就不怕远
1、一天很短,开心了就笑,不开心了就过会儿再笑。
2、真正的朋友从不追究你的过错,也从不嫉妒你的成功。
3、爱情就像是冰激凌,吃掉美味的奶油,就露出了它最真实的面目。
4、我宁愿爱上一个我不能拥有的人,也不想拥有一个我无法爱上的人。
5、品格不由你占有的东西决定,而是由你匮乏的东西塑造的。
6、痛过,才知道如何保护自己; 哭过,才知道心痛是什么感觉, 傻过,才知道适时的坚持与放弃, 爱过,才知道自己其实很脆弱。 其实,生活并不需要这么些无谓的执著,没有什么就真的不能割舍。
7、命,乃失败者的借口;运,乃成功者的谦辞。
8、一个人头脑聪明本领大,当然是好事,脑瓜子笨一点能力差一点也没有关系,只要有必胜的信念,只要有决不放弃的原则,照样能成为一个优秀的人物。
9、派大星:“嗨,海绵宝宝,我们去抓水母吧。”海绵宝宝:“对不起,今天不行,我要上学。”派大星:“如果你去上学的话,我今天该干点什么?”海绵宝宝:“我不知道,一般我不在家的时候,你都干些什么啊?”派大星:“等你回来。”
10、想把别人推进地狱的人,多半自己也住在地狱里。
11、也许我们很难知道,离成功究竟还有多远,但是我们十分清楚,自己到底还能撑多久。我们不一定能等到成功到来的那一刻,但可以肯定的是,我们可以坚持到自己的最后一刻。
12、你拨动了我的心弦,却不曾为我驻足,当我以为你还在的时候,你已没有踪影,当你回头找寻我的时候,我已开始寻找自己的天空。亲爱的,我把最美好的年华留给了你,我,于你无愧。亲爱的,我的青春有限,承担不起一生一世的等待。亲爱的,让我骄傲一次,这次,是我不要你了。
13、安妮宝贝《彼岸花》:任何一件事情,只要心甘情愿,总是能够变得简单。
14、《刺猬的优雅》:某些事情必须结束,某些事情必须开始。我只是渴望一件事情:那就是希望别人能让我平静地度过此生,不要对我太苛刻,此外,我能每天花点时间,能够尽情满足自己的饥渴,足矣。
15、《飘》:我从来不是那样的人,不能耐心地拾起一片碎片,把它们凑合在一起,然后对自己说这个修补好了的东西跟新的完全一样。一样东西破碎了就是破碎了,我宁愿记住它最好时的模样,而不想把它修补好,然后终生看着那些碎了的地方。
16、魏剑美:做人做事最好的状态就是:不刻意。不刻意自我表现,也不刻意淡泊名利;不刻意迎合,也不刻意狂狷;不刻意追逐流行,也不刻意卓尔不群。如是,则不心累,不纠结,不失望。
17、路金波:莫要晒甜蜜,莫要秀幸福。因为物理学常识告诉我们,晒容易流失水分,而冷藏是保鲜的最佳方式。
18、韩寒:鹅卵石为什么被人捏在手里玩?就是因为它没有棱角。
19、宋丹丹:原本只想要一个拥抱,不小心多了一个吻,然后你发现需要一张床,一套房,一个证……离婚的时候才想起:你原本只想要一个拥抱。
20、路走对了,就不怕远!
The value (30) of MAXTRANS parameter ignored
1、现象
Mon Aug 8 08:16:07 2011
The value (30) of MAXTRANS parameter ignored.
kupprdp: master process DM00 started with pid=91, OS id=21125
to execute – SYS.KUPM$MCP.MAIN(‘SYS_EXPORT_TABLE_01’, ‘YDZJ’, ‘KUPC$C_1_20110808081609’, ‘KUPC$S_1_20110808081609’, 0);
kupprdp: worker process DW01 started with worker id=1, pid=57, OS id=21127
to execute – SYS.KUPW$WORKER.MAIN(‘SYS_EXPORT_TABLE_01’, ‘YDZJ’);
kupprdp: worker process DW02 started with worker id=2, pid=95, OS id=21502
to execute – SYS.KUPW$WORKER.MAIN(‘SYS_EXPORT_TABLE_01’, ‘YDZJ’);
2、原因
这个时间段正在使用expdp进行数据库导出,当然从错误描述也可以看出和导出操作有关,不过当时导出是成功,没有报任何错误。 在metalink查询 ,发现这是Version: 10.1.0.2 to 11.1.0.7 (任何平台) 的一个bug,Bug号为:6347775
这是由于在创建备份主表时使用了如下语句:
CREATE TABLE table_name (columns_list) INITRANS 10 MAXTRANS 30
而Maxtrans参数在10gR1时已经废弃,所以在告警日志中就提示:
The value (30) of MAXTRANS parameter ignored. , 此bug没有什么影响,所以可以忽略。
3、重现
SQL> create table xff(xifenfei varchar2(100)) initrans 10 maxtrans 20;
Table created.
查看alert日志
Mon Aug 8 16:11:28 2011
The value (20) of MAXTRANS parameter ignored.
利用DNSPod域名解析实现blog高可用
因为blog的服务器不太稳定,经常有异常断网或者关机现象发生,今天采用了利用一些基本资源,使用了高可用,整体思路采用DNSPod域名解析提供的免费检测服务器状态,如果主服务器发生宕机,自动切换到备机功能(监控功能)实现高可用。
1、配置备用服务器和主服务器一致,使用相同的域名均可以访问(修改电脑的hosts文件测试)
在本次配置中,主要是固定url的功能
1.1)apache中启用该模块mod_rewrite
1.2).htaccess文件中内容
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
1.3)启用FollowSymLinks功能
“Options Indexes FollowSymLinks
… …
AllowOverride None”
改为
“Options Indexes FollowSymLinks
… …
AllowOverride All”
2、配置DNSPod监控功能,添加备机ip到域名解析中
3、既然思路是当一台服务器发生故障时,域名解析自动切换到备用服务器,那么问题就是主服务器和备服务器的数据要一致,因为是网站,涉及的数据一致主要就是数据库内容一致,网站上传编辑附件一致即可
3.1)mysql数据库同步(因为这个是个人blog,对数据的实时性,一致要求不是异常的高,所以采用crontab实现同步,如果要求高,可以采用mysql 主主复制实现)
#!/bin/bash #目标数据库 target_db=******* target_user=******* target_pwd=******* target_host=******* #源数据库 source_db=******* source_user=******* source_pwd=******* source_host=******* #其他配置 dumptime=$(date +%y%m%d%H%M) dumpfile=/home/chengfei/backup/mysql/${dumptime}.sql logfile=/home/chengfei/backup/log/syc_mysql.log #开始操作 echo "开始数据库同步……`date`……">>${logfile} #导出数据库 /usr/bin/mysqldump -u${source_user} -p${source_pwd} -h${source_host} ${source_db} >${dumpfile} 2>> ${logfile} #导入数据库 mysql -u${target_user} -p${target_pwd} -h${target_host}<<XFF>> ${logfile} drop database ${target_db}; create database ${target_db}; use ${target_db}; source ${dumpfile} exit XFF #操作结束 echo "数据库同步结束……`date`……">>${logfile} echo ''>>${logfile} --crontab 00 2,12,14,16,18,20,22,24 * * * /home/chengfei/backup/script/sysc_mysql.sh
3.2)因为我这个blog上传编辑图片类的内容非常少,暂时没有考虑网站文件同步功能,以后可以考虑实现。目前初步方案是采用scp或者ftp结合crontab功能实现定时同步
V$LOCK视图相关知识
1、V$LOCK视图结构
列名 | 类型 | 字段说明 |
ADDR | RAW(4 | 8) | Address of lock state object |
KADDR | RAW(4|8) | Address of lock |
SID | NUMBER | 会话的sid,可以和v$session 关联 |
TYPE | VARCHAR2(2) | 区分该锁保护对象的类型(表4) TM – DML enqueue TX – Transaction enqueue UL – User supplied –我们主要关注TX和TM两种类型的锁 –UL锁用户自己定义的,一般很少会定义,基本不用关注 –其它均为系统锁,会很快自动释放,不用关注 |
ID1 ID2 |
NUMBER | ID1,ID2的取值含义根据type的取值而有所不同 对于TM 锁 ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0 对于TX 锁 ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式: 0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数 |
LMODE | NUMBER |
|
REQUEST | NUMBER | 同LMODE –大于0时,表示当前会话被阻塞,其它会话占有改锁的模式 |
CTIME | NUMBER |
|
BLOCK | NUMBER |
|
2、其它相关视图说明
视图名 | 描述 | 主要字段说明 |
v$session | 查询会话的信息和锁的信息。 | sid,serial#:表示会话信息。 program:表示会话的应用程序信息。 row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。 lockwait :该会话等待的锁的地址,与v$lock的kaddr对应. |
v$session_wait | 查询等待的会话信息。 | sid:表示持有锁的会话信息。 Seconds_in_wait:表示等待持续的时间信息 Event:表示会话等待的事件,锁等于enqueue |
dba_locks | 对v$lock的格式化视图。 | Session_id:和v$lock中的Sid对应。 Lock_type:和v$lock中的type对应。 Lock_ID1: 和v$lock中的ID1对应。 Mode_held,mode_requested:和v$lock中的lmode,request相对应。 |
v$locked_object | 只包含DML的锁信息,包括回滚段和会话信息。 | Xidusn,xidslot,xidsqn:表示回滚段信息。和v$transaction相关联。 Object_id:表示被锁对象标识。 Session_id:表示持有锁的会话信息。 Locked_mode:表示会话等待的锁模式的信息,和v$lock中的lmode一致。 |
表3
锁模式 | 锁描述 | 解释 | SQL操作 |
0 | none | ||
1 | NULL | 空 | Select |
2 | SS(Row-S) | 行级共享锁,其他对象只能查询这些数据行 | Select for update Lock for update Lock row share |
3 | SX(Row-X) | 行级排它锁,在提交前不允许做DML操作 | Insert/update/Delete Lock row share |
4 | S(Share) | 共享锁 | Create index Lock share |
5 | SSX(S/Row-X) | 共享行级排它锁 | Lock share row exclusive |
6 | X(Exclusive) | 排它锁 | Alter table Drop able Drop index Truncate table Lock exclusive |
表4
System Type | Description | System Type | Description |
BL | Buffer hash table instance | NA..NZ | Library cache pin instance (A..Z = namespace) |
CF | Control file schema global enqueue | PF | Password File |
CI | Cross-instance function invocation instance | PI, PS | Parallel operation |
CU | Cursor bind | PR | Process startup |
DF | datafile instance | QA..QZ | Row cache instance (A..Z = cache) |
DL | Direct loader parallel index create | RT | Redo thread global enqueue |
DM | Mount/startup db primary/secondary instance | SC | System change number instance |
DR | Distributed recovery process | SM | SMON |
DX | Distributed transaction entry | SN | Sequence number instance |
FS | File set | SQ | Sequence number enqueue |
HW | Space management operations on a specific segment | SS | Sort segment |
IN | Instance number | ST | Space transaction enqueue |
IR | Instance recovery serialization global enqueue | SV | Sequence number value |
IS | Instance state | TA | Generic enqueue |
IV | Library cache invalidation instance | TS | Temporary segment enqueue (ID2=0) |
JQ | Job queue | TS | New block allocation enqueue (ID2=1) |
KK | Thread kick | TT | Temporary table enqueue |
LA .. LP | Library cache lock instance lock (A..P = namespace) | UN | User name |
MM | Mount definition global enqueue | US | Undo segment DDL |
MR | Media recovery | WL | Being-written redo log instance |
Total insert collisions (ogg)
1、错误现象
Replicating from ECP.TAB_UUM_PACKAGE to RWGL.TAB_UUM_USER:
*** Total statistics since 2011-08-05 10:34:10 ***
2、错误原因
RWGL.TAB_UUM_USER表上有insert触发器,导致失败。因为触发器使得插入操作为插入和触发器中的操作绑定为了一个整体,现在因为触发器失败,导致插入失败,而且还会丢失该条插入记录,需要查找出该条记录比较困难。
3、解决方案
采用自治事件结合异常捕获
自治事件使得触发器和插入操作相互分离,异常捕获记录触发器失败的原因,插入到日志表中,通过该表,可以查询查失败的记录,然后人工干预,触发器实例:
create or replace trigger ogg_t before insert on t_1 for each row declare tid NUMBER; err VARCHAR2(100); PRAGMA AUTONOMOUS_TRANSACTION; BEGIN SELECT t.id2 INTO tid FROM t_2 t WHERE NAME=:new.Name; INSERT INTO t_3 VALUES(tid,:new.name); COMMIT; EXCEPTION WHEN TOO_MANY_ROWS THEN INSERT INTO t_error VALUES(:new.id,'TOO_MANY_ROWS'); COMMIT; WHEN NO_DATA_FOUND THEN INSERT INTO t_error VALUES(:new.id,'NO_DATA_FOUND'); COMMIT; WHEN OTHERS THEN err:=SUBSTR(SQLERRM(SQLCODE),1,100); INSERT INTO t_error VALUES(:new.id,err); COMMIT; end ogg_t;
1)PRAGMA AUTONOMOUS_TRANSACTION;
自治事务,就是说触发器不管是成功,还是失败,数据库同步程序都能够同步成功数据到目标端
2)COMMIT;
因为采用了自治事件,所以begin end中的操作是独立与数据库中数据,需要单独提交
3)EXCEPTION
添加异常处理
4)INSERT INTO t_error VALUES(:new.id,’TOO_MANY_ROWS’);(类此语句,注意commit)
建立一张错误日志表(根据具体情况决定),如果触发器失败,把错误记录到该表中,以后出现问题查找很方便(要求:通过该表能够查询到那条语句的触发器执行失败。失败原因,失败时间,额外列(用于确定对应记录))