--重新分析表 analyze table table1 compute statistics for table for all indexes for all indexed columns; --解析执行计划 explain plan for select xx1,xx2,xx3,xx4,xx5 from table1 t1 where t1.xx1 = 'yyy';
Category Archives: RDB
关闭和打开Oralce10g自动收集COB信息
前几天,发现平台的一支程序突然运行的很慢,经分析后,发现是数据库查询变得超级慢。
用OB9分析后,发现索引正常,没办法最后重启了数据库后,速度直接飚上来了。
但好景不长,第二天早上4点后,又变成龟速,只好找公司DBA帮忙分析问题。
最后发现是Oracle的自动统计分析Job,每天自动进行统计,然后优化器就不走索引,而走统计分析的结果。
而我们的表有较多的删除操作,很快统计分析的结果就不可靠了,结果速度很快就下来了。
最后,禁用之,搞定:)
--状态查询
select * from Dba_Scheduler_Jobs where JOB_NAME ='GATHER_STATS_JOB'
--sysdba
--关闭
exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');
--sysdba
--启用
exec dbms_scheduler.enable('SYS.GATHER_STATS_JOB');
Oracle11g导入到Oracle10g
1、导出
set PATH=D:\Oracle11g\product\11.2.0\dbhome_1\BIN;%PATH% expdp USERID/PWD schemas=XXX VERSION=10.2 DIRECTORY=data_pump_dir DUMPFILE=XXX.dmp LOGFILE=exp.log pause
2、导入
set PATH=D:\Oracle11g\product\11.2.0\dbhome_1\BIN;%PATH% impdp USERID/PWD schemas=XXX DIRECTORY=data_pump_dir DUMPFILE=XXX.dmp LOGFILE=imp.log pause
Oracle中大字容量字段
LONG
可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个。
表中最多一个LONG列
LONG RAW
可变长二进制数据,最长2G
CLOB
字符大对象Clob 用来存储单字节的字符数据
NCLOB
用来存储多字节的字符数据
BLOB
用于存储二进制数据
BFILE
存储在文件中的二进制数据,这个文件中的数据只能被只读访。但该文件不包含在数据库内。
bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针。
bfile对oracle来说是只读的,也不参与事务性控制和数据恢复。
其中CLOB,NCLOB,BLOB都是内部的LOB(Large Object)类型,最长4G,没有LONG只能有一列的限制。
Oracle ORA-01461
昨天做联调时,在10g上测试一点儿问题都没有,但切到9i的库上,却直接报错:
ORA-01461:仅可以为插入 LONG 列的 LONG 值赋值
查找资料后发现,是Oracle9i的一个bug,当Clob字段长度在1000~2000之间时,
就会出现这个错误。
解决方法有两个:
1、替换驱动为神奇的版本ojdbc14-10.2.0.3.0.jar,可以避免这个问题。
2、利用Spring+Hibernate解决这个问题
EventSendInfo.hbm.xml
-<property name="MSG" type="java.lang.String"> +<property name="MSG" type="org.springframework.orm.hibernate3.support.ClobStringType">
applicationContext.xml
... <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> ... +<property name="lobHandler" ref="oracleLobHandler"/> </bean> ... +<bean id ="oracleLobHandler" class ="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init ="true"> +<property name ="nativeJdbcExtractor" ref ="nativeJdbcExtractor"/> +</bean > +<bean id ="nativeJdbcExtractor" class ="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true"/> ...
Oracle的DBF文件减肥
使用OB9,DBA身份登录:
表空间信息-》双击需要RESIZE的表空间-》定义信息-》修改大小后-》创建
或者用SQL:
--枚举DBF文件 SELECT * FROM dba_data_files --缩小文件 ALTER DATABASE DATAFILE 'DBF_FILE_PATH' RESIZE 512m
常见错误:
ORA-03297: 文件包含在请求的RESIZE值以外使用的数据
这个错误产生的原因是,虽然DBF文件使用率很低,但一些数据存储在了RESIZE值以外,
无法直接进行缩小DBF文件的操作。
要么把数据导出,缩小DBF文件后倒入,再倒入;
要么需要查出哪些表和索引在RESIZE值以外,移动到临时空间后,进行RESIZE操作,再移动回来。
Oracle回收站
Oracle10g中,经常可以看到BIN$开头的表,这些表是在回收站中的。
回收站常用命令:
--查询回收站 SELECT t.object_name,t.type ,t.original_name FROM user_recyclebin t; --清空回收站 PURGE recyclebin; --删除回收站中表,使用删除前表名 PURGE table origenal_tableName; --删除回收站中索引,使用删除前索引名 PURGE index origenal_indexName; --彻底删除一个表 drop table tableName purge;
MySQL忘记管理员密码
方法一:
1、关闭mysql授权
#关闭mysql /etc/init.d/mysql stop #以不需要授权的模式启动mysql #修改/etc/mysql/my.cnf添加下面的内容 [mysqld] skip-grant-tables #开启mysql /etc/init.d/mysql start
2、修改密码
#登录mysql
mysql
mysql> use mysql;
#旧版本
mysql> UPDATE user SET password=password("xxx") WHERE user='root';
#新版本
mysql> update user set authentication_string=PASSWORD('xxx') where User='root';
mysql> flush privileges;
mysql> exit;
3、开启mysql授权
#关闭mysql /etc/init.d/mysql stop #以不需要授权的模式启动mysql #修改/etc/mysql/my.cnf禁用skip-grant-tables [mysqld] #skip-grant-tables #开启mysql /etc/init.d/mysql start
4、搞定
方法二
1、关闭mysql授权
#关闭mysql service mysql stop #以不需要授权的模式启动mysql mysqld_safe --skip-grant-tables
2、修改密码
#登录mysql
mysql
mysql> use mysql;
#旧版本
mysql> UPDATE user SET password=password("xxx") WHERE user='root';
#新版本
mysql> update user set authentication_string=PASSWORD('xxx') where User='root';
mysql> flush privileges;
mysql> exit;
3、开启mysql授权
#关闭mysql service mysql stop #开启mysql service mysql start
4、搞定
Oracle游标
游标处理数据范例(在原示例上有删减):
CREATE OR REPLACE PROCEDURE ATS_GUEST.GATETOSERVER
(
HOSPITAL_DOMAIN IN VARCHAR2,
START_DATE IN VARCHAR2,
END_DATE IN VARCHAR2
)
AS
PARM_SQL VARCHAR2(4000);
PARM_BODY_PART VARCHAR2(256);
PARM_METHOD_CODE VARCHAR2(256);
PARM_REPEAT_NUMBER VARCHAR2(256);
PARM_MACHINE_NAME VARCHAR2(256);
PARM_DEVICE_NAME VARCHAR2(256);
PARM_STUDY_UID VARCHAR2(256);
PARM_UNIQUE_ID VARCHAR2(256);
PARM_DOC_ROOT VARCHAR2(256);
PARM_CURSOR SYS_REFCURSOR;
BEGIN
IF (HOSPITAL_DOMAIN ='2.16.840.1.113883.4.487.1.4.1') THEN
PARM_SQL:= 'SELECT CDA_UNIQUE_ID,DOC_AUTHORITY_ROOT,DICOM_BODY_PART,DIAGNOSIS_METHOD_CODE,REPEAT_NUMBER,MACHINE_ROOM_NAME,DEVICE_NAME,DICOM_STUDY_UID FROM ADGATE.REPORTDOC@GATETOSERVER WHERE DOC_AUTHORITY_ROOT=''' || HOSPITAL_DOMAIN || '''';
END IF;
PARM_SQL:= PARM_SQL || ' AND EFFECTIVE_TIME > TO_DATE(''' || START_DATE || ''',''yyyymmddhh24miss'') AND EFFECTIVE_TIME < TO_DATE(''' || END_DATE || ''',''yyyymmddhh24miss'')';
DBMS_OUTPUT.PUT_LINE(PARM_SQL);
OPEN PARM_CURSOR FOR PARM_SQL;
LOOP
FETCH PARM_CURSOR INTO PARM_UNIQUE_ID,PARM_DOC_ROOT,PARM_BODY_PART,PARM_METHOD_CODE,PARM_REPEAT_NUMBER,PARM_MACHINE_NAME,PARM_DEVICE_NAME,PARM_STUDY_UID;
PARM_SQL:= 'UPDATE AXDS.DOCUMENTSCATTER SET BODY_PART = ''' || PARM_BODY_PART || ''',';
PARM_SQL:= PARM_SQL || 'DIAGNOSIS_METHOD_CODE = ''' || PARM_METHOD_CODE || ''',';
PARM_SQL:= PARM_SQL || 'REPEAT_NUMBER = ''' || PARM_REPEAT_NUMBER || ''',';
PARM_SQL:= PARM_SQL || 'MACHINE_ROOM_NAME = ''' || PARM_MACHINE_NAME || ''',';
PARM_SQL:= PARM_SQL || 'DEVICE_NAME = ''' || PARM_DEVICE_NAME || ''',';
PARM_SQL:= PARM_SQL || 'STUDY_UID = ''' || PARM_STUDY_UID || ''',';
PARM_SQL:= PARM_SQL || 'CUSTOM1 = ''TEST''';
PARM_SQL:= PARM_SQL || ' WHERE AXDS.DOCUMENTSCATTER.CDA_UNIQUE_ID = ''' || PARM_UNIQUE_ID || ''' AND AXDS.DOCUMENTSCATTER.DOC_AUTHORITY_ROOT = ''' || PARM_DOC_ROOT || '''';
--next line will break this PROCEDURE
--DBMS_OUTPUT.PUT_LINE(PARM_SQL);
EXECUTE IMMEDIATE PARM_SQL;
COMMIT;
IF (HOSPITAL_DOMAIN ='2.16.840.1.113883.4.487.1.4.1') THEN
PARM_SQL:= 'UPDATE ADGATE.REPORTDOC@GATETOSERVER SET CUSTOM_5 = ''TEST'' WHERE ADGATE.REPORTDOC.CDA_UNIQUE_ID = ''' || PARM_UNIQUE_ID || ''' AND ADGATE.REPORTDOC.DOC_AUTHORITY_ROOT = ''' || PARM_DOC_ROOT || '''';
EXECUTE IMMEDIATE PARM_SQL;
COMMIT;
END IF;
EXIT WHEN PARM_CURSOR%NOTFOUND;
END LOOP;
CLOSE PARM_CURSOR;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
Oracle、SQL Server、MySQL的语句变化总结
| 调整内容 | Oracle | SQL Server | MySQL |
| 数据类型:字符 | VARCHAR2 | NVARCHAR | |
| 数据类型:数字 | NUMBER | tinyint,smallint,int,bigint | |
| 数据类型:时间 | TIMESTAMP | DATATIME | |
| 列自增 | sqeuence.nextval | identity(1,1) | identity(1,1) |
| 约束主键 | CONSTRAINT 表名 PRIMARY KEY (列名) USING INDE | PRIMARY KEY | |
| 约束唯一 | CONSTRAINT 表名 UNIQUE (列名) USING INDEX | UNIQUE INDEX | |
| 注释 | commnet | sp_addextendedproperty | |
| 函数时间 | sysdate | getdate() | |
| 查询分页 | rownum | top | limit |
| 查询跨库 | 库名.表名 | 库名.dbo.表名 | limit |
| 执行存储过程 | call | exec |