??xml version="1.0" encoding="utf-8" standalone="yes"?>exp user/password@servername indexes=n grants=n buffer=500000000 direct=y
file=vresolve.dmp tables=(wepp_domain_resolve_table);
导入表利器:(x)
imp user/password@servername ignore=y buffer=500000000 fromuser=epp_formigrate
file=vresolve.dmp tables=(wepp_domain_resolve_table)
结果写入新表利?
create table domain_filter_table as select v.DOMAIN_NAME from epp_domain_unresolve t,epp_ent_all_idxlog_view v where
t.associate_serial=v.ASSOCIATE_ENT_SERIAL
]]>SELECT OBJECT_ID,SESSION_ID,SERIAL#,
ORACLE_USERNAME,OS_USER_NAME,S.PROCESS
FROM V$LOCKED_OBJECT A,
V$SESSION S WHERE A.SESSION_ID=S.SID
2.
alter system kill session 'sid,serial#';
]]>
相同的查询语?一U采用绑定参数方式查询,一U采用写ȝsql语句执行Q执行结果不一?br />
版权声明Q{载时请以链接Ş式标明文章原始出处和作者信息及(qing)本声?/a>
http://kimva.blogbus.com/logs/8219967.html
ORACLE数据库字W集Q即Oracle全球化支?Globalization Support)Q或卛_家语a支持QNLSQ其作用是用本国语言和格式来存储、处理和索数据。利用全球化支持QORACLE为用h供自q(zhn)的数据库母语环境,诸如日期格式、数字格式和存储序列{。Oracle可以支持多种语言?qing)字W集Q其中oracle8i支持48U语a?6个国家地域?29U字W集Q而oracle9i则支?7U语a?8个国家地域?35U字W集。由于oracle字符集种cdQ且在存储、检索、迁Uoracle数据时多个环节与字符集的讄密切相关Q因此在实际的应用中Q数据库开发和理人员l常?x)遇到有关oracle字符集方面的问题。本文通过以下几个斚w阐述Q对oracle字符集做要分?
二.字符集基本知?
2.1字符?br />
实质是按照一定的字符~码Ҏ(gu)Q对一l特定的W号Q分别赋予不同数值编码的集合。Oracle数据库最早支持的~码Ҏ(gu)是US7ASCII?br />
Oracle的字W集命名遵@以下命名规则:
<Language><bit size><encoding>
? <语言><比特位数><~码>
比如: ZHS16GBK表示采用GBK~码格式?6位(两个字节Q简体中文字W集
2.2字符~码Ҏ(gu)
2.2.1 单字节编?br />
Q?Q单字节7位字W集Q可以定?28个字W,最常用的字W集为US7ASCII
Q?Q单字节8位字W集Q可以定?56个字W,适合于欧z大部分国家
例如QWE8ISO8859P1(西欧?位、ISO标准8859P1~码)
2.2.2 多字节编?br />
Q?Q变长多字节~码
某些字符用一个字节表C,其它字符用两个或多个字符表示Q变长多字节~码常用于对亚洲语言的支持, 例如日语、汉语、印地语{?br />
例如QAL32UTF8Q其中AL代表ALL,指适用于所有语aQ、zhs16cgb231280
Q?Q定长多字节~码
每一个字W都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节~码是AF16UTF16Q也是仅用于国家字符?br />
2.2.3 unicode~码
Unicode是一个涵盖了目前全世界用的所有已知字W的单一~码Ҏ(gu)Q也是说Unicode为每一个字W提供唯一的编码。UTF-16是unicode?6位编码方式,是一U定长多字节~码Q用2个字节表CZ个unicode字符QAF16UTF16是UTF-16~码字符集?br />
UTF-8是unicode?位编码方式,是一U变长多字节~码Q这U编码可以用1??个字节表CZ个unicode字符QAL32UTF8QUTF8、UTFE是UTF-8~码字符?
2.3 字符集超U?br /> 当一U字W集Q字W集AQ的~码数值包含所有另一U字W集Q字W集BQ的~码数|q且两种字符集相同编码数g表相同的字符Ӟ则字W集A是字W集B的超U,或称字符集B是字W集A的子集?br /> Oracle8i和oracle9i官方文档资料中备有子?对照表(subset-superset pairsQ,例如QWE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式,因此有许多字W集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集?
2.4 数据库字W集Qoracle服务器端字符集)
数据库字W集在创建数据库时指定,在创建后通常不能更改。在创徏数据库时Q可以指定字W集(CHARACTER SET)和国家字W集(NATIONAL CHARACTER SET)?br />
2.4.1字符?br />
(1)用来存储CHAR, VARCHAR2, CLOB, LONG{类型数?br />
(2)用来标示诸如表名、列名以?qing)PL/SQL变量{?br />
(3)用来存储SQL和PL/SQLE序单元{?br />
2.4.2国家字符集:(x)
(1)用以存储NCHAR, NVARCHAR2, NCLOB{类型数?br />
(2)国家字符集实质上是ؓ(f)oracle选择的附加字W集Q主要作用是Z增强oracle的字W处理能力,因ؓ(f)NCHAR数据cd可以提供对亚z用定长多字节~码的支持,而数据库字符集则不能。国家字W集在oracle9i中进行了重新定义Q只能在unicode~码中的AF16UTF16和UTF8中选择Q默认值是AF16UTF16
2.4.3查询字符集参?br />
可以查询以下数据字典或视图查看字W集讄情况
nls_database_parameters、props$、v$nls_parameters
查询l果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示国家字符?br />
2.4.4修改数据库字W集
按照上文所_(d)数据库字W集在创建后原则上不能更攏V如果需要修改字W集Q通常需要导出数据库数据Q重建数据库Q再导入数据库数据的方式来{换,或通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字W集是有限制的,只有新的字符集是当前字符集的集时才能修Ҏ(gu)据库字符集,例如UTF8是US7ASCII的超集,修改数据库字W集可用ALTER DATABASE CHARACTER SET UTF8。正的修改Ҏ(gu)如下:
$sqlplus /nolog
SQL>conn / as sysdba;
若此时数据库服务器已启动Q则先执行SHUTDOWN IMMEDIATE命o(h)关闭数据库服务器Q然后执行以下命?
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
2.5 客户端字W集QNLS_LANG参数Q?br />
2.5.1客户端字W集含义
客户端字W集定义了客L(fng)字符数据的编码方式,M发自或发往客户端的字符数据均用客L(fng)定义的字W集~码,客户端可以看作是能与数据库直接连接的各种应用Q例如sqlplus,exp/imp{。客L(fng)字符集是通过讄NLS_LANG参数来设定的?br />
2.5.2 NLS_LANG参数格式
NLS_LANG=<language>_<territory>.<client character set>
Language:昄oracle消息,校验Q日期命?br />
TerritoryQ指定默认日期、数字、货币等格式
Client character setQ指定客L(fng)用的字符?br />
例如QNLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN是语aQAMERICA是地区,US7ASCII是客L(fng)字符?br />
2.5.3客户端字W集讄Ҏ(gu)
1)UNIX环境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
~辑oracle用户的profile文g
2)Windows环境
~辑注册?br />
Regedit.exe---HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0
2.5.4 NLS参数查询
Oracle提供若干NLS参数定制数据库和用户Z适应本地格式Q例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER{,可以通过查询以下数据字典或v$视图查看?br />
NLS_DATABASE_PARAMETERS--昄数据库当前NLS参数取|包括数据库字W集取?br />
NLS_SESSION_PARAMETERS--昄由NLS_LANG 讄的参敎ͼ或经qalter session 改变后的参数|不包括由NLS_LANG 讄的客L(fng)字符集)
NLS_INSTANCE_PARAMETE--昄由参数文件init<SID>.ora 定义的参数V$NLS_PARAMETERS--昄数据库当前NLS参数取?br />
2.5.5修改NLS参数
使用下列Ҏ(gu)可以修改NLS参数
Q?Q修改实例启动时使用的初始化参数文g
Q?Q修改环境变量NLS_LANG
Q?Q用ALTER SESSION语句Q在oracle?x)话中修?br />
Q?Q用某些SQL函数
NLS作用优先U别QSql function>alter session>环境变量或注册表>参数文g>数据库默认参?
三.导入/导出与字W集转换
3.1 EXP/IMP
Export ?Import 是一对读写Oracle数据的工兗Export ?Oracle 数据库中的数据输出到操作pȝ文g? Import 把这些文件中的数据读到Oracle 数据库中Q由于用exp/impq行数据q移Ӟ数据从源数据库到目标数据库的q程中有四个环节涉及(qing)到字W集Q如果这四个环节的字W集不一_(d)会(x)发生字符集{换?
EXP
IMP
四个字符集是
Q?Q源数据库字W集
Q?QExportq程中用户会(x)话字W集Q通过NLS_LANG讑֮Q?br />
Q?QImportq程中用户会(x)话字W集Q通过NLS_LANG讑֮Q?br />
Q?Q目标数据库字符?
3.2导出的{换过E?br />
在Exportq程中,如果源数据库字符集与Export用户?x)话字符集不一_(d)?x)发生字W集转换Qƈ在导出文件的头部几个字节中存储Export用户?x)话字符集的ID受在q个转换q程中可能发生数据的丢失?br />
?如果源数据库使用ZHS16GBKQ而Export用户?x)话字符集用US7ASCIIQ由于ZHS16GBK?6位字W集,而US7ASCII?位字W集Q这个{换过E中Q中文字W在US7ASCII中不能够扑ֈ对等的字W,所以所有中文字W都?x)丢p变?#8220;?? ”形式Q这栯{换后生成的Dmp文g已经发生了数据丢失?br />
因此如果x导出源数据库数据,则Exportq程中用户会(x)话字W集应等于源数据库字W集或是源数据库字符集的集
3.2.1 修改dmp文g字符?br />
上文说过Qdmp文g的第2W?字节记录了字W集信息Q因此直接修改dmp文g的第2W?字节的内容就可以‘?#8217;qoracle的检查。这样做理论上也仅是从子集到集可以修改Q但很多情况下在没有子集和超集关pȝ情况下也可以修改Q我们常用的一些字W集Q如US7ASCIIQW(xu)E8ISO8859P1QZHS16CGB231280QZHS16GBK基本都可以改。因为改的只是dmp文gQ所以媄响不大?br />
具体的修Ҏ(gu)法比较多Q最单的是直接用UltraEdit修改dmp文g的第2和第3个字节。比如想dmp文g的字W集改ؓ(f)ZHS16GBKQ可以用以下SQL查出该种字符集对应的16q制代码:
SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
0354
然后dmp文g??字节修改?354卛_?br />
如果dmp文g很大Q用ue无法打开Q就需要用E序的方法了。网上有人用java存储q程写了转换的程?用java存储q程的好处是通用性教好,~点是比较麻?。我在windows下测试通过。但要求oracle数据库一定要安装JVM选项。有兴趣的朋友可以研I一下程序代?
3.3导入的{换过E?br />
Q?Q确定导出数据库字符集环?br />
通过d导出文g_(d)可以获得导出文g的字W集讄
Q?Q确定导入session的字W集Q即导入Session使用的NLS_LANG环境变量
Q?QIMPd导出文g
d导出文g字符集IDQ和导入q程的NLS_LANGq行比较
Q?Q如果导出文件字W集和导入Session字符集相同,那么在这一步骤内就不需要{换,如果不同Q就需要把数据转换为导入Session使用的字W集。可以看出,导入数据到数据库q程中发生两ơ字W集转换
W一?导入文g字符集与导入Session使用的字W集之间的{换,如果q个转换q程不能正确完成QImport向目标数据库的导入过E也׃能完成?br />
W二?导入Session字符集与数据库字W集之间的{换?br />
然?oracle8i的这U{换只能在单字节字W集之间q行,oracle8i导入Session不支持多字节字符集之间的转换Q因此ؓ(f)了避免第一ơ{换,导入Session使用的NLS_LANG与导出文件字W集相同Q第二次转换Q通过SQL*NetQ支持Q何两U字W集。以上情况在Oracle9i中略有不?
四.q问题
oracle在数据存储、迁U过E中l常发生字符q问题Q归根到底是׃字符集用不当引赗下面以使用客户端sqlplus向数据库插入数据和导?导出QEXP/IMPQ过Eؓ(f)例,说明q产生的原因?
4.1使用客户端sqlplus向数据库存储数据
q个q程存在3个字W集讄
Q?Q客L(fng)应用字符?br />
Q?Q客L(fng)NLS_LANG参数讄
Q?Q服务器端数据库字符?Character Set)讄
客户端应用sqlplus中能够显CZ么样的字W取决于客户端操作系l语a环境(客户端应用字W集)Q但在应用中录入q些字符后,q些字符能否在数据库中正常存储,q与另外两个字符集设|紧密相养I其中客户端NLS_LANG参数主要用于字符数据传输q程中的转换判断。常见的q大致有两U情形:(x)
Q?Q汉字变成问?#8220;Q?#8221;Q?br />
当从字符集A 转换成字W集BӞ如果转换字符之间不存在对应关p,NLS_LANG使用替代字符“Q?#8221;替代无法映射的字W?br />
Q?Q汉字变成未知字W(虽然有些是汉字,但与原字W含义不同)
转换存在对应关系Q但字符集A 中的字符~码与字W集B 中的字符~码代表不同含义
4.2发生q原因
q产生是由于几个字W集之间转换不匹配造成Q分以下几种情况Q?br />
Q注Q字W集之间如果不存在子集、超集对应关pL的情况不予考虑Q因U情况下字符集之间{换必产生qQ?nbsp;
1Q服务器端数据库字符集与客户端应用字W集相同Q与客户端NLS_LANG参数讄不同
如果客户端NLS_LANG字符集是其它两种字符集的子集Q{换过E将出现q?br />
解决Ҏ(gu)Q将三种字符集设|成同一字符集,或NLS_LANG字符集是其它两种字符集的集
2Q服务器端数据库字符集与客户端NLS_LANG参数讄相同Q与客户端应用字W集不同
如果客户端应用字W集是其它两U字W集的超集时Q{换过E将出现qQ但对于单字节编码存储中文问题,可参看本文第5章节的分?br />
3Q客L(fng)应用字符集、客L(fng)NLS_LANG参数讄、服务器端数据库字符集互不相?br />
此种情况较ؓ(f)复杂Q但三种字符集之间只要有不能转换的字W,则必产生q
4.3导入/导出q程出现q原因
q个q程存在4个字W集讄Q在3.1章节中已分析
Q?Q源数据库字W集
Q?QEXPq程中NLS_LANG参数
Q?QIMPq程中NLS_LANG参数
Q?Q目标数据库字符?br />
出现q原因
1Q当源数据库字符集不{于EXPq程中NLS_LANG参数Q且源数据库字符集是EXPq程中NLS_LANG的子集,才能保证导出文g正确Q其他情况则导出文g字符q
2QEXPq程中NLS_LANG字符集不{于IMPq程中NLS_LANG字符集,且EXPq程中NLS_LANG字符集是IMPq程中NLS_LANG字符集的子, 才能保证W一ơ{换正常,否则W一ơ{换中出现q?br />
3Q如果第一ơ{换正常,IMPq程中NLS_LANG字符集是目标数据库字W集的子集或相同Q才能保证第二次转换正常Q否则则W二ơ{换中出现q
五.单字节编码存储中文问?
׃历史的原因,早期的oracle没有中文字符集(如oracle6、oracle7、oracle7.1Q?但有的用户从那时起就使用数据库了Qƈ用US7ASCII字符集存储了中文Q或是有的用户在创徏数据库时Q不考虑清楚Q随意选择一个默认的字符集,如WE8ISO8859P1或US7ASCIIQ而这两个字符集都没有汉字~码Q虽然有些时候选用q种字符集好象也能正怋用,但用q种字符集存储汉字信息从原则上说是错误的,它会(x)l数据库的用与l护带来一pd的麻烦?br /> 正常情况下,要将汉字存入数据库,数据库字W集必须支持中文Q而将数据库字W集讄为US7ASCII{单字节字符集是不合适的。US7ASCII字符集只定义?28个符Pq不支持汉字。另外,如果在SQL*PLUS中能够输入中文,操作pȝ~省应该是支持中文的Q但如果在NLS_LANG中的字符集设|ؓ(f)US7ASCIIQ显然也是不正确的,它没有反映客L(fng)的实际情c(din)但在实际应用中汉字昄却是正确的,q主要是因ؓ(f)Oracle查数据库与客L(fng)的字W集讄是同L(fng)Q那么数据在客户与数据库之间的存取过E中不发生M转换Q但是这实际上导致了数据库标识的字符集与实际存入的内Ҏ(gu)不相W的。而在SELECT的过E中QOracle同样查发现数据库与客L(fng)的字W集讄是相同的Q所以它也将存入的内容原不动地传送到客户端,而客L(fng)操作pȝ识别是汉字编码所以能够正显C?br /> 在这个例子中Q数据库与客L(fng)都没有设|成中文字符集,但却能正常显CZ文,从应用的角度看好象没问题。然而这里面却存在着极大的隐(zhn),比如在应用length或substr{字W串函数Ӟ可能得到意外的l果?br /> 对于早期使用US7ASCII字符集数据库的数据迁Udoracle8i/9i中(使用zhs16gbkQ,׃原始数据已经按照US7ASCII格式存储Q对于这U情况,可以通过使用Oracle8i的导出工P讄导出字符集ؓ(f)US7ASCIIQ导出后使用UltraEdit{工h开dmp文gQ修改第二、三字符Q修?0001 ?354,q样可以将US7ASCII字符集的数据正确导入到ZHS16GBK的数据库中?
六.l束?
Z避免在数据库q移q程中由于字W集不同D的数据损失,oracle提供了字W集扫描工具Qcharacter set scannerQ,通过q个工具我们可以试在数据迁U过E中׃字符集{换可能带来的问题Q然后根据测试结果,定数据q移q程中最?jng)_W集解决Ҏ(gu)?
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /Data/apps/mysql/var) or
# ~/.my.cnf to set user-specific options.
# www.aslibra.com by hqlulu
/Data/apps/mysql/bin/mysqld_safe --user=mysql &
停止命o(h)Q?br />
mysqladmin -u root -pyourpassword shutdown
080502 04:12:23 mysqld started
080502 4:12:23 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
080502 04:12:23 mysqld ended
080502 04:15:37 mysqld started
080502 4:15:37 [ERROR] /Data/apps/mysql/libexec/mysqld: Can't find file: './mysql/host.frm' (errno: 13)
080502 4:15:37 [ERROR] /Data/apps/mysql/libexec/mysqld: Can't find file: './mysql/host.frm' (errno: 13)
080502 4:15:37 [ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13)
080502 04:15:37 mysqld ended
[mysqld]
port = 3307
socket = /tmp/mysql.sock
[mysqld]
port = 3308
socket = /tmp/mysql.sock
[mysqld]
port = 3309
socket = /tmp/mysql.sock
/Data/apps/mysql/bin/mysqld_safe --defaults-file=/Data/apps/mysql/var/my_setting.cnf --user=mysql &
/Data/apps/mysql/bin/mysqld_safe --defaults-file=/Data/apps/mysql/var/my_setting.cnf --user=mysql --port=3341 &
讄:
对于单台q行的WEB服务?加上:
skip-locking
skip-name-resolve
skip-networking
在PHP链接数据库时使用"LOCALHOST".q样MySQL 客户端库覆盖之q尝试连接到本地套接?(
我们可以从PHP.INI?/p>
代码:
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
mysql.default_socket = /tmp/mysql.sock看出 默认情况?UNIX 访?tmp/mysql.sock)
以下是部分选项解释:
my.cnf默认是不存在?你可以在/usr/local/share/mysql/下看?
my-huge.cnf
my-innodb-heavy-4G.cnf
my-large.cnf
my-medium.cnf
my-small.cnf
{文?其中合适你机器配置的文件拷贝到/etc/my.cnf或mysql data目录/my.cnf(/var/db/mysql)下或~/.my.cnf.文g内都有详l的说明
[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock
skip-locking
# 避免MySQL的外部锁定,减少出错几率增强E_性?/p>
skip-name-resolve
止MySQL对外部连接进行DNS解析Q用这一选项可以消除MySQLq行DNS解析的时间。但需要注意,如果开启该选项Q则所有远E主接授权都要用IP地址方式Q否则MySQL无法正常处理连接请?
back_log = 384
指定MySQL可能的连接数量。当MySQLȝE在很短的时间内接收到非常多的连接请求,该参数生效,ȝE花费很短的旉查连接ƈ且启动一个新U程?/p>
back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。如果系l在一个短旉内有很多q接Q则需要增大该参数的|该参数值指定到来的TCP/IPq接的侦听队列的大小。不同的操作pȝ在这个队列大上有它自己的限制?/p>
试图讑֮back_log高于你的操作pȝ的限制将是无效的。默认gؓ(f)50。对于Linuxpȝ推荐讄为小?12的整数?/p>
key_buffer_size = 256M
# key_buffer_size指定用于索引的缓冲区大小Q增加它可得到更好的索引处理性能?/p>
对于内存?GB左右的服务器该参数可讄?56M?84M?/p>
注意Q该参数D|的q大反而会(x)是服务器整体效率降低!
max_allowed_packet = 4M
thread_stack = 256K
table_cache = 128K
sort_buffer_size = 6M
查询排序时所能用的~冲区大。注意:(x)该参数对应的分配内存是每q接独占!如果?00个连接,那么实际分配的d排序~冲区大ؓ(f)100 × 6 = 600MB。所以,对于内存?GB左右的服务器推荐讄?-8M?/p>
read_buffer_size = 4M
L询操作所能用的~冲区大。和sort_buffer_size一P该参数对应的分配内存也是每连接独?
join_buffer_size = 8M
联合查询操作所能用的~冲区大,和sort_buffer_size一P该参数对应的分配内存也是每连接独?
myisam_sort_buffer_size = 64M
table_cache = 512
thread_cache_size = 64
query_cache_size = 64M
指定MySQL查询~冲区的大小。可以通过在MySQL控制台执行以下命令观察:(x)
代码:
# > SHOW VARIABLES LIKE '%query_cache%';
# > SHOW STATUS LIKE 'Qcache%';如果Q(jng)cache_lowmem_prunes的值非常大Q则表明l常出现~冲不够的情?
如果Q(jng)cache_hits的值非常大Q则表明查询~冲使用非常频繁Q如果该D?yu)反而会(x)影响效率Q那么可以考虑不用查询~冲;Qcache_free_blocksQ如果该值非常大Q则表明~冲Z片很多?/p>
tmp_table_size = 256M
max_connections = 768
指定MySQL允许的最大连接进E数。如果在讉K论坛时经常出现Too Many Connections的错误提 C,则需要增大该参数倹{?/p>
max_connect_errors = 10000000
wait_timeout = 10
指定一个请求的最大连接时_(d)对于4GB左右内存的服务器可以讄?-10?/p>
thread_concurrency = 8
该参数取gؓ(f)服务器逻辑CPU数量×2Q在本例中,服务器有2颗物理CPUQ而每颗物理CPU又支持H.T线E,所以实际取gؓ(f)4 × 2 = 8
skip-networking
开启该选项可以d关闭MySQL的TCP/IPq接方式Q如果WEB服务器是以远E连接的方式讉KMySQL数据库服务器则不要开启该选项!否则无法正常连?
从Mysql 5.x的某个版本之后,MySQL的自动关闭空闲连接的Ҏ(gu)被修改了,假如一个连接空闲到时旉(默认28000U?时)Q再ơ发L(fng)Reconnect重新q接h不会(x)被接受,需要重新徏立新q接Q这导致了SER的重q机制不能正常工作:(x)SER只会(x)在需要操作数据库时去使用同一个连接接口,断开了则发v重新q接hQ而且q个问题短期内SER也不能够解决?/p>
下文中将具体讲述处理的方法:(x)
1.使用Mysql 4.0?.1版本Q如果没有用到Mysql 5的一些新Ҏ(gu)比如存储过E触发器之类?/p>
2.定时重启Mysql服务器或Ser(׃本问题可能同样会(x)影响到其它一些需要Mysql支持的服务器E序Q所以重启Mysql服务器ؓ(f)好,但需要检Mysql服务器不被用的一个时间重启比较难定)
3.讄my.cnfQ有mysqld字段内增加参敎ͼ(x)
[mysqld]port = 3306socket = /tmp/mysql.sockwait_timeout= 500000interactive_timeout = 500000(500000U约五六天的时旉Q可Ҏ(gu)实际需要选择一个数据库可能I闲的最长时间稍大的旉倹{?重启Mysqld应用卛_Q也可以在执行mysqld时加-o wait_timeout=500000参数同样效果?/p>
在MySQL客户端show variable时应该可以看到最后一条从默认的wait_time=28000变成500000了?/p>
(假如重启Mysqld不生效,可以重启机子)
ȝ1 选择索引 |
比如在雇员表?#8220;性别”列上只有“?#8221;?#8220;?#8221;两个不同|因此无必要建立索引。如果徏立烦引不但不?x)提高查询效率?br />
反而会(x) 严重降低更新速度?br />
3 l合索引要尽量关键查询形成索引覆盖Q其前导列一定是使用最频繁的列?br />
ȝ2 避免使用不兼容的数据cd |
ȝ3 IS NULL 与IS NOT NULL |
ȝ4 IN和EXISTS |
改ؓ(f)
因ؓ(f)1中对empq行了full table scan,q是很浪Ҏ(gu)间的操作。而且1中没有用到emp的INdexQ?br />
因ؓ(f)没有WHERE子句。?中的语句对empq行的是range scan?br />
ȝ5 IN、OR子句怼(x)使用工作表,使烦引失?/td> |
ȝ6 避免或简化排?/td> |
ȝ7 消除对大型表行数据的序存取 |
虽然在customer_num和order_num上徏有烦引,但是在上面的语句中优化器q是使用序存取路径扫描整个表。因个语句要索的是分ȝ行的集合Q所以应该改为如下语句:(x)
q样p利用索引路径处理查询?br />
ȝ8 避免相关子查?/td> |
ȝ9 避免困难的正规表辑ּ |
即在zipcode字段上徏立了索引Q在q种情况下也q是采用序扫描的方式。如果把语句改ؓ(f)
在执行查询时׃(x)利用索引来查询,昄?x)大大提高速度?br /> 另外Q还要避免非开始的子串。例如语句:(x)
在WHERE子句中采用了非开始子Ԍ因而这个语句也不会(x)使用索引?br />
不充份的q接条g |
20S
<1S
分析Q?br />
在第一个连接条件下Q最x询方案是account作外层表Qcard作内层表Q利用card上的索引Q其I/Oơ数可由以下公式估算为:(x)
外层表account上的22541?Q外层表account?91122?内层表card上对应外层表W一行所要查扄3)=595907ơI/O
在第二个q接条g下,最x询方案是card作外层表Qaccount作内层表Q利用account上的索引Q其I/Oơ数可由以下公式估算为:(x)
外层表card上的1944?Q外层表card?896?内层表account上对应外层表每一行所要查扄4)= 33528ơI/O
可见Q只有充份的q接条gQ真正的最x案才?x)被执行?br />
多表操作在被实际执行前,查询优化器会(x)Ҏ(gu)q接条gQ列出几l可能的q接Ҏ(gu)q从中找出系l开销最的最x案。连接条件要充䆾考虑带有索引的表、行数多的表Q内外表的选择可由公式Q外层表中的匚w行数*内层表中每一ơ查扄ơ数定Q乘U最ؓ(f)最x案?br />
不可优化的WHERE子句
?
下列SQL条g语句中的列都建有恰当的烦引,但执行速度却非常慢Q?br />
(13U?
Q?1U)
Q?0U)
分析Q?br />
WHERE子句中对列的M操作l果都是在SQLq行旉列计算得到的,因此它不得不q行表搜索,而没有用该列上面的索引Q如果这些结果在查询~译时就能得刎ͼ那么可以被SQL优化器优化,使用索引Q避免表搜烦Q因此将SQL重写成下面这P(x)
Q?lt; 1U)
Q?lt; 1U)
Q?lt; 1U)
存储q程中,采用临时表优化查?/td> |
q个语句序读parvenQ?0)Q写一个(f)时表Q?0)Qƈ排序。假定排序的开销?00,d?00c(din)?br />
2Q把临时表和vendor表连接,把结果输出到一个(f)时表Qƈ按part_num排序Q?br />
q个查询dpv_by_vn(50?Q它通过索引存取vendor?.5万次Q但׃按vendor_numơ序排列Q实际上只是通过索引序地读 vendor表(40Q?=42)Q输出的表每늺95行,?60c(din)写q存取这些页引发5Q?60=800ơ的dQ烦引共d892c(din)?br />
3Q把输出和partq接得到最后的l果Q?br />
q样Q查询顺序地读pvvn_by_pn(160?Q通过索引读part?.5万次Q由于徏有烦引,所以实际上q行1772ơ磁盘读写,优化比例?0??br />
好了Q搞定?br />
帔R优化Q?/td> |
操作W优?/td> |
合理的烦引设?/td> |
语句B
语句C
1 在date上徏有一个非聚集索引
AQ?25U?
BQ?27U?
CQ?55U?
分析Q?br />
date上有大量的重复|在非聚集索引下,数据在物理上随机存放在数据页上,在范围查找时Q必L行一ơ表扫描才能扑ֈq一范围内的全部行?br />
2 在date上的一个聚集烦?br />
AQ(14U)
BQ(14U)
CQ(28U)
分析Q?br />
在聚集烦引下Q数据在物理上按序在数据页上,重复g排列在一P因而在范围查找Ӟ可以先找到这个范围的h点,且只在这个范围内扫描数据,避免了大范围扫描Q提高了查询速度?br />
3 在placeQdateQamount上的l合索引
AQ(26U)
CQ(27U)
BQ(< 1U)
分析Q?br />
q是一个不很合理的l合索引Q因为它的前导列是placeQ第一和第二条SQL没有引用placeQ因此也没有利用上烦引;W三个SQL使用了placeQ且引用的所有列都包含在l合索引中,形成了烦引覆盖,所以它的速度是非常快的?br />
4 在dateQplaceQamount上的l合索引
AQ?nbsp;(< 1U?
BQ(< 1U)
CQ(11U)
分析Q?br />
q是一个合理的l合索引。它?yu)date作ؓ(f)前导列,使每个SQL都可以利用烦引,q且在第一和第三个SQL中Ş成了索引覆盖Q因而性能辑ֈ了最优?br />
在我现在开发的所有的pȝ中,我都采用了上q的方式Q这样做属于未雨l缪Q一旦系l部|后再修改,可能来不及(qing)了?
补充Q近日公司的另一套CMSpȝQ已l出?了上q问题。clob字段直接|于业务表中Q现业务表记录已?0余万Q查询的速度非常~慢Q被q采用各U方式来解决。如果当初设计时p虑到这斚w׃?x)有q样的问题了?
PSQ解x案之一是,可以在Pojo中加入构造函敎ͼ参数中包含除clob字段外的所有其它字D,通过select new Pojo(field1,field2,.....) from Pojo的方式来处理。但要注意,fieldx不能为集合类型,只能为基本数据类型或Pocd。如public Pojo(Long id,String name,User usr,Date createDate){}
oracle.part1.rar、oracle.part2.rar、oracle.part3.rar
2.安装软g
分别安装“Oracle客户?#8221;?#8220;PLSQL Developer”软g?/p>
3.配置
Oracle客户端的配制文gQ默认会(x)安装?#8220;C:\Oracle\ora90\network\ADMIN”目录下,名ؓ(f)“tnsnames.ora”参考格式如下:(x)
ORCL_192.168.1.246 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.246)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl)
(SERVER = DEDICATED)
)
)
2008-01-15 10:28:19 发表, 已被览? 7 )?nbsp;?推荐到内|?/a>?首页 ?查看评论 |
zt, for MYISAM tables of older Mysql versions.
q日Q一位Discuz!老用L(fng)论坛在发表回复时出现“The table is full”的提C,字面意义上是数据表已满的意思。因为很有开发者遭遇单一表超q?G的情况,因此朋友间的讨论只能提供一些外围的信息。ؓ(f)解决此问题,我翻阅了很多资料Q本文将以我此次问题的解册E,介绍问题发生的原因及(qing)对策?/p>
Ҏ(gu)l验QThe table is full提示往往出现在以下两U情况:(x)
1. 表中讄了MAX_ROWS|单的_(d)若MAX_ROWS讄?00Q而程序试囑ֆ入第101条记录,?x)出现此错误?/p>
2. 表满。这U情冉|本文讨论的重炏V?/p>
我们认ؓ(f)MySQL在存取表的时候,存在一U定位分配规律。这个规律在默认的情况下Q可以寻址4G以内的数据。超q这个大,数据库将不能Ҏ(gu)据定位,因而也无法q行d。经q实验,q个限制是完全可以被H破的?/p>
本例中,用户的系l环境ؓ(f)双Athlon处理器、SCSI盘72G?G内存Q用L(fng)帖子表数据尺ؓ(f)4294963640Q接q?G(4G的实际字节数?294967296)?/p>
首先SSHd后,查看用户的系l信息:(x)
# uname -a
Linux zichen.com 2.4.20-8smp #1 SMP Thu Mar 13 16:43:01 EST 2003 i686 athlon i386 GNU/Linux
证明是LinuxpȝQ根据内核版?.4.20-8smpQ加上国内用的常见pȝQ估计应该是redhat 9发行包?/p>
# cat /etc/*release*
Red Hat Linux release 9 (Shrike)
q也证明了我们对pȝ版本的猜惟?/p>
然后看一下用的是什么文件系l。因用户q高手Q估计在装系l的时候就是一路回车下来,redhat 9默认的应该是EXT3Q不q我们还是看一下:(x)
# parted
GNU Parted 1.6.3
Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This program is free software, covered by the GNU General Public License.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Using /dev/sda
Information: The operating system thinks the geometry on /dev/sda is 8942/255/63. Therefore, cylinder 1024 ends at 8032.499M.
(parted) print
Disk geometry for /dev/sda: 0.000-70149.507 megabytes
Disk label type: msdos
Minor Start End Type Filesystem Flags
1 0.031 101.975 primary ext3 boot
2 101.975 10103.378 primary linux-swap
证明实是这样子。随后我们翻阅了EXT3文gpȝ的相x术参敎ͼEXT3是在EXT2基础上演变而来?font color="#ff0000">EXT2所支持最大单一文g长度?GQ这个是很蹩脚的一个限制。EXT3做的很大一个改善就是将q个限制攑֤C2TBQ由此稍松一口气Qv码不是操作系l上的限制?/p>
l过朋友的开|了解到单一文g大小有如下几个因素:(x)
1. 文gpȝ的限?如刚存所说EXT3?TB限制)
2. 某一E序q程所能存取的W一文g最大尺?例如apache在Linux EXT3下能存取的最大尺ؓ(f)2GQ诸如日?
初步判断瓉在上述其中W二V随后找到myisamchk来显CZ下表信息Q证明了瓉在MySQL本n的存取上?/p>
# myisamchk -dv cdb_posts
l果׃贴了Q其中有一Max datafile length的值恰好就?G。由此生了瓉?/p>
后来阅了N多资料,q行了N多尝试,也走了不弯路,最l觉得还是官Ҏ(gu)档比较可靠。比较老的文档里写道这是由于tmp_table_size的值造成的,也有提到用BIG-TABLESq个参数。事实证明这些都是歧途。大晚上的确实很累,q里只给出最l的解决Ҏ(gu)吧,中间的就不罗嗦了?/p>
q到mysql客户端?/p>
# mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 59411 to server version: 4.0.18-standard
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> use ******
Database changed
mysql> ALTER TABLE cdb_posts MAX_ROWS=1000000000 AVG_ROW_LENGTH=15000;
因ؓ(f)q个表非常大Q执行时间在双Athlon的专业服务器上竟然花?0分钟Q?/p>
之后再通过myisamchk查看该表的信息:(x)
# myisamchk -dv cdb_posts
MyISAM file: cdb_posts
Record format: Packed
Character set: latin1 (8)
File-version: 1
Creation time: 2004-08-30 22:19:48
Recover time: 2004-08-30 22:42:47
Status: open,changed
Auto increment key: 1 Last value: 1063143
Data records: 619904 Deleted blocks: 5
Datafile parts: 619909 Deleted data: 323872
Datafile pointer (bytes): 6 Keyfile pointer (bytes): 4
Datafile length: 4295287332 Keyfile length: 40421376
Max datafile length: 281474976710654 Max keyfile length: 4398046510079
Recordlength: 149
table description:
Key Start Len Index Type Rec/key Root Blocksize
1 1 4 unique unsigned long 1 4535296 1024
2 5 2 multip. unsigned short 13776 12540928 1024
3 111 4 multip. unsigned long 1 18854912 1024
4 28 3 multip. uint24 18 24546304 1024
5 7 3 multip. uint24 7 32827392 1024
111 4 unsigned long 1
6 7 3 multip. uint24 7 40418304 1024
28 3 uint24
令h振奋的事情发生了Q该表的 Max datafile length: 281474976710654 Max keyfile length: 4398046510079Q即最大数据尺?MYD文g)辑ֈ?TBQ最大烦引尺?MYI)仍然?G?/p>
由此默认?G限制被突破了。关于其中的原理Q其实很单:(x)假设你有一个日记本Q上面有10늺可以写东西,~排目录只需?个字?因ؓ(f)0?够?。如果你把这本子又塞q两张纸Q变?2,1个字节的目录I间无法寻址到后面的两页中,q而生了错误。上面那个ALTER语句中的数值都是我Z证成功,取的比较大的?因ؓ(f)ALTER一ơ实在是太慢了,没时间在那ؕ试验)Q相当于告诉数据库,q个本子?000000000,每页q_?15000个字节。这h据库便知道这是很大的一个本子,因此不遗余力的拿Z100?假设?做目录编排,q样q个新的目录可以寻址到日记本的所有内容了。错误消失?/p>
惟一的缺点就是,目录占用的空间多了一些,但已l微乎其微了Q做了这U改变其?G的文件尺寸大只增大?M多,非常令h振奋?/p>
从Oracle10g开始,Oracle引入?a >flashback drop的新Ҏ(gu)?/font>Q这个新Ҏ(gu),允许你从当前数据库中恢复一个被drop了的对象。在执行drop操作Ӟ现在Oracle不是真正删除它,而是该对象自动放入回收站。对于一个对象的删除Q其实仅仅就是简单的重o(h)名操作?
q个功能虽然可以极大的简化误dropD的恢复操作,但是长时间的U篏可能?x)导致大量的I间占用(虽然Oracleh自己的清理机?Q很多时候我们需要手工介入去清理回收站。本文主要介l清理回收站的几U方?
1.大量累计的空间占?
2.不同用户在回收站的对?
3.我们可以指定删除某些特定对象
SQL> purge table common.T_SERVICE_CODE_INFO;
Table purged. 4.指定清除某个表空间的所有回收站对象
5.以SYSDBAw䆾可以清除所有回收站对象
SQL> purge dba_recyclebin;
DBA Recyclebin purged.
SQL> select owner,count(*) from dba_recyclebin group by owner;
no rows selected 6.用recyclebin
如果我们不希望用Oracle的recyclebin,可以通过参数用q个Ҏ(gu)?
在Oracle10gR1中,通过修改一个隐含参?_recyclebin 为False可以用q个Ҏ(gu)?
在Oracle10gR2中,recyclebin变成了一个常规参敎ͼ可以在session/systemU动态修?
所谓的回收站,是一个虚拟的容器Q用于存放所有被删除的对象。在回收站中Q被删除的对象将占用创徏时的同样的空_(d)你甚臌可以对已l删除的表查询,也可以利用flashback功能来恢复它Q?q个是flashback drop功能?
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.3.0
Connected as SYS
SQL> col owner for a12
SQL> select owner,object_name,CREATETIME,DROPTIME from dba_recyclebin
2 order by droptime
3 /OWNER OBJECT_NAME CREATETIME DROPTIME
------------ ------------------------------ ------------------- -------------------
COMMON BIN$AHsQ+pi+Kb/gRAADumkBdQ==$0 2005-08-29:16:42:19 2005-09-11:15:36:17
COMMON BIN$AHsQ+pi9Kb/gRAADumkBdQ==$0 2005-08-29:16:42:19 2005-09-11:15:36:17
PDA BIN$AdEb4zqqUcTgRAADumkBdQ==$0 2005-09-05:10:31:01 2005-09-28:15:40:39
......
BJLAIS_RUN BIN$BtkGRT0dSwfgRAADumkBdQ==$0 2005-11-30:10:54:07 2005-12-01:16:13:17
BJLAIS_RUN BIN$BtkGRT0cSwfgRAADumkBdQ==$0 2005-11-30:10:54:07 2005-12-01:16:13:17750 rows selected
SQL>
SQL> select owner,count(*) from dba_recyclebin group by owner;
OWNER COUNT(*)
-------------------- ----------
BJLAIS_RUN 44
COMMON 8
MMSBLOG 618
MMSHAWA_RUN 2
PDA 8
RING_RUN 706 rows selected.
SQL> purge tablespace common;
Tablespace purged.
SQL> select owner,count(*) from dba_recyclebin group by owner;
OWNER COUNT(*)
-------------------- ----------
BJLAIS_RUN 44
MMSBLOG 618
MMSHAWA_RUN 2
PDA 8
RING_RUN 70
SQL> set linesize 132
SQL> column name format a30
SQL> column value format a25
SQL> select
2 x.ksppinm name,
y.ksppstvl value,
3 y.ksppstdf isdefault,
4 5 decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE') ismod,
6 decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE') isadj
7 from
8 sys.x$ksppi x,
9 sys.x$ksppcv y
10 where
11 x.inst_id = userenv('Instance') and
12 y.inst_id = userenv('Instance') and
13 x.indx = y.indx and
14 x.ksppinm like '%&par%'
15 order by
16 translate(x.ksppinm, ' _', ' ')
17 /
Enter value for par: recyclebin
old 14: x.ksppinm like '%&par%'
new 14: x.ksppinm like '%recyclebin%'NAME VALUE ISDEFAULT ISMOD ISADJ
------------------------------ ------------------------- --------- ---------- -----
_recyclebin TRUE TRUE FALSE FALSE1 row selected.
[oracle@danaly ~]$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Dec 12 15:34:56 2005
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine optionsSQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string onSQL> alter session set recyclebin=off;
Session altered.
SQL> alter session set recyclebin=on
2 /Session altered.
SQL> alter system set recyclebin=off;
System altered.
SQL> alter system set recyclebin=on;
System altered.
一直就xq篇文章加进来,只可以一直没有时间。刚好今天给我在试机器上来了个误操作rm * backup/*,把正在运行的数据库中的数据文件全部删除了Q真是郁Pq好q个是给我们Ch们测试玩的,要不然就d了!在此也做一个提醒,wؓ(f)DBA,要永q记住甚用或者禁止用rm命o(h)Q万不得以的情况下,使用时在敲enter也要看了又看、慎重又慎重才行Q?/strong>好了Q费话不说了Q下面请看我的过E?/p>
Red Hat Enterprise 3 + Oracle 10g Release 2 $su – oracle 1--- 讄pȝ环境变量Q?/span> ORACLE_HOME=/opt/oracle/product/10.2 ORACLE_BASE=/opt/oracle ORACLE_SID=dbtest ...... 2--- pȝ规划Q?/span> 实例名称ORACLE_SID=dbtest 数据库名U?/span>DB_NAME=dbtest 3--- 手工创徏如下目录Q?/span> /opt/oracle/admin/dbtest/cdump /opt/oracle/admin/dbtest/bdump /opt/oracle/admin/dbtest/udump /opt/oracle/admin/dbtest/pfile /opt/oracle/oradata/dbtest/ /opt/oracle/oradata/dbtest/archive 4--- 建立密码文gQ?/span> orapwd file=/opt/oracle/product/10.2/dbs/orapwd_dbtest password=superman 5---修改参数文gQ?/span> 格式Q?/span>/opt/oracle/product/10.2/dbs/init.ora 实例Q?/span>/opt/oracle/product/10.2/dbs/initdbtest.ora 内容如下Q?/span> --------------------------------------------------- dbtest.__db_cache_size=331350016 dbtest.__java_pool_size=4194304 dbtest.__large_pool_size=8388608 dbtest.__shared_pool_size=138412032 dbtest.__streams_pool_size=0 *._kgl_large_heap_warning_threshold=8388608 *.audit_file_dest='/opt/oracle/admin/dbtest/adump' *.background_dump_dest='/opt/oracle/admin/dbtest/bdump' *.compatible='10.2.0.1.0' *.control_files='/opt/oracle/oradata/dbtest/control01.ctl','/opt/oracle/oradata/dbtest/control02.ctl','/opt/oracle/oradata/dbtest/control03.ctl' *.core_dump_dest='/opt/oracle/admin/dbtest/cdump' *.db_2k_cache_size=33554432 *.db_block_size=8192 *.db_domain='' *.db_file_multiblock_read_count=128 *.db_files=4000 *.db_name='dbtest' *.db_recovery_file_dest_size=4294967296 *.db_recovery_file_dest='' *.log_archive_dest='/opt/oracle/oradata/dbtest/archive' *.log_checkpoints_to_alert=FALSE *.open_cursors=300 *.parallel_execution_message_size=65535 *.parallel_max_servers=128 *.pga_aggregate_target=209715200 *.processes=150 *.recyclebin='OFF' *.remote_login_passwordfile='EXCLUSIVE' *.replication_dependency_tracking=FALSE *.session_cached_cursors=100 *.sga_target=500m *.shared_pool_size=100m *.undo_management='AUTO' *.undo_retention=0 *.undo_tablespace='UNDOTS' *.user_dump_dest='/opt/oracle/admin/dbtest/udump' *.workarea_size_policy='AUTO' _allow_resetlogs_corruption=true
---------------------------------------------------
可将此文件复制到Q?/span>/opt/oracle/admin/dbtest/pfile/init.ora 6--- 登陆oracleQ?/span> > sqlplus “/ as sysdba” 7--- 启动实例Q?/span> SQL> startup nomount pfile=/opt/oracle/admin/dbtest/pfile/init.ora 8--- 创徏数据库的脚本Q?/span> ----------------------------------------------------------- CREATE DATABASE dbtest LOGFILE GROUP 1 ('/opt/oracle/oradata/dbtest/redo01.log','/opt/oracle/oradata/dbtest/redo01_1.log') size 100m reuse, GROUP 2 ('/opt/oracle/oradata/dbtest/redo02.log','/opt/oracle/oradata/dbtest/redo02_1.log') size 100m reuse, GROUP 3 ('/opt/oracle/oradata/dbtest/redo03.log','/opt/oracle/oradata/dbtest/redo03_1.log') size 100m reuse MAXLOGFILES 50 MAXLOGMEMBERS 5 MAXLOGHISTORY 200 MAXDATAFILES 500 MAXINSTANCES 5 ARCHIVELOG CHARACTER SET UTF8 NATIONAL CHARACTER SET UTF8 DATAFILE '/opt/oracle/oradata/dbtest/system01.dbf' SIZE 1000M EXTENT MANAGEMENT LOCAL SYSAUX DATAFILE '/opt/oracle/oradata/dbtest/sysaux01.dbf' SIZE 1000M UNDO TABLESPACE UNDOTS DATAFILE '/opt/oracle/oradata/dbtest/undo.dbf' SIZE 500M DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/opt/oracle/oradata/dbtest/temp.dbf' SIZE 500M ; ----------------------------------------------------------- 9--- q行如下文g(安装下面的先后顺?font face="Times New Roman">)
/opt/oracle/product/10.2/rdbms/admin/catalog.sql
/opt/oracle/product/10.2/rdbms/admin/catproc.sql
10--- 创徏相关表空间与用户Q?/strong>
CREATE TABLESPACE USERS DATAFILE '/opt/oracle/oradata/dbtest/users01.dbf' SIZE 1000M;---数据表空?/span>
CREATE TABLESPACE INDX DATAFILE '/opt/oracle/oradata/dbtest/indx01.dbf' SIZE 1000M;---在徏立烦引的时候把此表I间作ؓ(f)存储I间Q即单独用一个表I间来存储烦引,q是个好?fn)惯Q虽然我们没有办法徏立一个默认的索引表空_(d)
CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE users ;---试用户
GRANT CONNECT,RESOURCE TO test;
11--- 一Ҏ(gu)意的地方Q?/strong>
1>.相关文g的目录要讄正确Q有数据文gQ控制文Ӟ参数文g{,q有是它们的位|要与控制文件中指定的要一致?/span>
2>.init.ora中的undo_tablespace的名字必要?/span>create database的相同,包括大小写等注意。否则很ȝQ报的错误你都不知道是不是在忽?zhn)你!MQ一句话Q控制文件中的内容要?/span>init文g中的内容以及(qing)要和实际文g的实际情况要相同?/span>
3>.分析数据库出错可以到/opt/oracle/admin/dbtest/bdump/alert_dbtest.log中查找?/span>
所谓?zhn)观?br />
先从(zhn)观锁开始说。在SqlServer{其余很多数据库中,数据的锁定通常采用锁的方式Q也是说对一张表内的数据是一U串行化的更新插入机Ӟ在Q何时间同一张表只会(x)?条数据,别的x入的数据要等到这一条数据插完以后才能依ơ插入。带来的后果是性能的降低,在多用户q发讉K的时候,当对一张表q行频繁操作Ӟ?x)发现响应效率很低,数据库经常处于一U假ȝ态。而Oracle用的是行U锁Q只是对想锁定的数据才进行锁定,其余的数据不相干Q所以在对Oracle表中q发插数据的时候,基本上不?x)有M影响?
注:(x)对于(zhn)观锁是针对q发的可能性比较大Q而一般在我们的应用中用乐观锁以?/span>
Oracle的?zhn)观锁需要利用一条现有的q接Q分成两U方式,从SQL语句的区别来看,是一U是for updateQ一U是for update nowait的Ş式。比如我们看一个例子。首先徏立测试用的数据库表?
q里我们利用了Oracle的Sample的scott用户的表Q把数据copy到我们的test表中。首先我们看一下for update锁定方式。首先我们执行如下的select for update语句?
通过q条索语句锁定以后,再开另外一个sql*plusH口q行操作Q再把上面这条sql语句执行一便,你会(x)发现sqlplus好像d那里了,好像索不到数据的样子Q但是也不返回Q何结果,属于卡在那里的感觉。这个时候是什么原因呢Q就是一开始的W一个Session中的select for update语句把数据锁定住了。由于这里锁定的机制是wait的状?只要不表Cnowait那就是wait)Q所以第二个Session(也就是卡住的那个sql*plus)中当前这个检索就处于{待状态。当W一个session最后commit或者rollback之后Q第二个session中的索结果就是自动蟩出来Qƈ且也把数据锁定住。不q如果你W二个session中你的检索语句如下所C?
也就是没有for updateq种锁定数据的语句的话,׃?x)造成d了。另外一U情况,是当数据库数据被锁定的时候,也就是执行刚才for update那条sql以后Q我们在另外一个session中执行for update nowait后又是什么样呢。比如如下的sql语句?׃q条语句中是制定采用nowait方式来进行检索,所以当发现数据被别的session锁定中的时候,׃(x)q速返回ORA-00054错误Q内Ҏ(gu)资源正忙, 但指定以 NOWAIT 方式获取资源。所以在E序中我们可以采用nowait方式q速判断当前数据是否被锁定中,如果锁定中的话,p采取相应的业务措施进行处理?
那这里另外一个问题,是当我们锁定住数据的时候,我们Ҏ(gu)据进行更新和删除的话?x)是什么样呢。比如同P我们让第一个Session锁定住id=10的那条数据,我们在第二个session中执行如下语句?
q个时候我们发现update语句好像select for update语句一样也停住卡在q里Q当你第一个session攑ּ锁定以后update才能正常q行。当你updateq行后,数据又被你update语句锁定住了Q这个时候只要你update后还没有commitQ别的session照样不能Ҏ(gu)据进行锁定更新等{?
MQOracle中的(zhn)观锁就是利用Oracle的ConnectionҎ(gu)据进行锁定。在Oracle中,用这U行U锁带来的性能损失是很的Q只是要注意E序逻辑Q不要给你一不小心搞成死锁了好。而且׃数据的及(qing)旉定,在数据提交时候就不呼出现冲突Q可以省d多恼人的数据冲突处理。缺点就是你必须要始l有一条数据库q接Q就是说在整个锁定到最后放开锁的q程中,你的数据库联接要始终保持住。与(zhn)观锁相对的Q我们有了乐观锁。乐观锁一开始也说了Q就是一开始假设不?x)造成数据冲突Q在最后提交的时候再q行数据冲突?br />
所谓乐观锁
在乐观锁中,我们?U?
W一U乐观锁的做法就是采用版本戳Q这个在Hibernate中得C使用。采用版本戳的话Q首先需要在你有乐观锁的数据库table上徏立一个新的columnQ比如ؓ(f)number型,当你数据每更Cơ的时候,版本数就?x)往上增?。比如同h2个session同样Ҏ(gu)条数据进行操作。两者都取到当前的数据的版本号ؓ(f)1Q当W一个sessionq行数据更新后,在提交的时候查看到当前数据的版本还?Q和自己一开始取到的版本相同。就正式提交Q然后把版本号增?Q这个时候当前数据的版本?。当W二个session也更C数据提交的时候,发现数据库中版本?Q和一开始这个session取到的版本号不一_(d)q道别人更新过此条数据Q这?
时候再q行业务处理Q比如整个Transaction都Rollback{等操作。在用版本戳的时候,可以在应用程序侧使用版本戳的验证Q也可以在数据库侧采用Trigger(触发?来进行验证。不q数据库的Trigger的性能开销q是比较的大Q所以能在应用侧q行验证的话q是推荐不用Trigger?
W二U做法和W二U做法有点类|是也新增一个Table的ColumnQ不q这ơ这个column是采用timestamp型,存储数据最后更新的旉。在Oracle9i以后可以采用新的数据cdQ也是timestamp with time zonecd来做旉戟뀂这UTimestamp的数据精度在Oracle的时间类型中是最高的Q精到微秒(q没与到U秒的?Q一般来_(d)加上数据库处理时间和人的思考动作时_(d)微秒U别是非帔R常够了,其实只要_到毫U甚至秒都应该没有什么问题。和刚才的版本戳cMQ也是在更新提交的时候检查当前数据库中数据的旉戛_自己更新前取到的旉戌行对比,如果一致则OKQ否则就是版本冲H。如果不x代码写在E序中或者由于别的原因无法把代码写在现有的程序中Q也可以把这个时间戳乐观锁逻辑写在Trigger或者存储过E中?
是基于应用的版本机制来实现的。一般会(x)在表里面设计一个版本字DvQ我一般会(x)把这个字D设为timestampQ。一般的update场景是这P(x)
1 select a, v from tb where id=1;
假设得到数据是:(x)['xxx', 11111]
2 update tb set a='yyyy', v=systimestamp where v=11111; //注意, v一般不?x)在业务操作的时候修?br />
q要求每一ơupdate操作都变更版本字Dc(din)否则还是要q程间的数据q是?x)被怺覆盖?
乐观锁无法锁定其他应用对数据的操作?br />
Windows集成w䆾登陆>>>
C:\>osql -E
1>
登陆后执行系l存储过E?br />1> sp_password NULL,"newpass","sa"
2> go
密码已更攏V?br />1> exit
再来看看sa混合模式登陆>>>
C:\>osql -SLocalhost -Usa -Pnewpass
1>
出现1>提示W表C登陆成?
再来看看osql命o(h)行下查询C:\>osql -SLocalhost -Usa -Pnewpass
1> use qz
2> Select count(*) from crjsj where kh=0
3> go
-----------
0
Q? 行受到媄响)
1>
查询pȝ?br />1> select name from sysobjects where xtype='U'
2> go
name
如果Q你?b style="mso-bidi-font-weight: normal">控制面板/理工具/服务中双?yn)L开OracleOraHome92TNSListener的服务看到其?b style="mso-bidi-font-weight: normal">可执行文件的路径”一栏ؓ(f)I时的处理方法:(x)
首先q行regedit.exe启动注册表编辑器Q在HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/下的Services和CurrentControlSet/Services下找?b style="mso-bidi-font-weight: normal">OracleOraHome92TNSListener,在右边窗口按右键Q?b style="mso-bidi-font-weight: normal">新徏/字符?/b>Q取?b style="mso-bidi-font-weight: normal">ImagePath?o:p>
双击新见的徏Q在“数值数据”项输入D:\oracle\ora92\bin\TNSLSNR.EXEQ根据你自己的实际情况进行修改)Q确定完成?/span>
再次在服务中双击打开OracleOraHome92TNSListener的服务看到其?b style="mso-bidi-font-weight: normal">可执行文件的路径”一栏已l显CZ其正的倹{这时你可以启动监听了?o:p>
同样也可以对OracleServiceKKDBq行操作Q不q将ImagePath的值改?b style="mso-bidi-font-weight: normal">D:\oracle\ora92\bin\oracle.exe KKDB卛_?o:p>
select
round(sysdate,'month') RM,
round(sysdate,'year') RY,
trunc(sysdate,'month') TM,
trunc(sysdate,'year') TY
from dual;
RM RY TM TY
---------- ---------- ---------- ----------
01-8?-06 01-1?-07 01-7?-06 01-1?-06
4>转换函数
隐式转换:pȝ自动转换,如:(x)
varchar2 or char to number
varchar2 or char to date
number to varchar2
date to varchar2
昑ּ转换QhZ函数加以转换
日期Q字W,数据三者之间可以相互{?日期<-->字符<-->数据
日期格式:YYYY
日期-->字符
select to_char(sysdate,'yyyy-mm-dd') ch from dual
CH
----------
2006-07-28
数字-->字符
to_char(number,'format_model'),oramat_model有如下:(x)
9---用对应数字表C?br />
0---强制用0表示
$---加一$W号
L---前加本地货币单位表示
.---十进制点
,---千进制点
select to_char(0917,'l9999.99') local from dual
LOCAL
------------------
RMB917.00
字符-->日期
tselect to_date('19830917','yyyy-mm-dd') bir from dual
BIR
----------
17-9?-83
字符-->数字
select to_number('19821217','999999999') mybr from dual
MYBR
----------
19821217
注:(x)所有函数均可以嵌套使用
5>通用函数
nvl(expr1,expr2)---expr1为空则显Cexpr2,否则昄expr1
nvl2(expr1,expr2,expr3)---expr1为空则显Cexpr2,否则昄expr3
nullif(expr1,expr2)---二个相等则显C空W?否则昄expr1
coalesce(expr1,expr2,...,exprn)---从expr1开始依ơ找C为空的exprQ找到就昄Q直到最后,否则?/p>
Cexprn
case表达式,如下?
6>多表查询
Ҏ(gu)通的多表查询Q也是不加where条g的时候实际上查询l果是各表的W卡?dng)?br />
外连接:(x)oracle实现外连接时?L(fng)二边?号就O(jin)KQ当+在左Ҏ(gu)UCؓ(f)双接,反之为左q接,它常常用来当要求未受限制对象的表数据也要求显C时Q如下:(x)
select * from student
ID NAME ADDRESS
-------------------- --------------
1 zhangshan zhejiang
3 lishi hangzhou
7 lily guangzhou
select * from person
ID NAME ADDRESS
- -------------------- -----------
1 zhangshan zhejiang
3 lishi hangzhou
7 lily guangzhou
select p.id,p.sex,s.id,s.name,s.address from person p ,student s where p.id(+) = s.id
ID SEX ID NAME ADDRESS
-- ---- ---------- -------------------- ------------
1 boy 1 zhangshan zhejiang
3 girl 3 lishi hangzhou
7 lily guangzhou
select p.id,p.sex,s.id,s.name,s.address from person p ,student s where p.id = s.id(+)
ID SEX ID NAME ADDRESS
-- ---- ---------- -------------------- --------------
1 boy 1 zhangshan zhejiang
2 girl
3 girl 3 lishi hangzhou
4 boy
5 girl
self-joinQ就是同一张表q接Q用自连接的时候要注意排除重复的记录(自nQ@环重复等Q,比如说找出student表中所有住在同一个地方的人?br /> select * from student
ID NAME ADDRESS
--- -------------------- ---------
1 zhangshan zhejiang
3 lishi hangzhou
7 lily guangzhou
2 name2 guangzhou
4 name4 guangzhou
5 name5 hangzhou
6 name6 shanghai
8 name8 shanghai
没有排除重复记录时的l果Q?br />
select t1.name,t2.name
from student t1, student t2
where t1.address = t2.address
NAME NAME
-------------------- --------------
lily lily
name2 lily
name4 lily
lily name2
name2 name2
name4 name2
lily name4
name2 name4
name4 name4
lishi lishi
name5 lishi
NAME NAME
-------------------- --------------
lishi name5
name5 name5
name6 name6
name8 name6
name6 name8
name8 name8
zhangshan zhangshan
已选择18?/p>
排除重复与@环记录之后:(x)
select t1.name,t2.name,t1.address
from student t1, student t2
where t1.address = t2.address
and t1.id > t2.id
NAME NAME ADDRESS
-------------------- -------------------- -------------------
lily name2 guangzhou
name4 name2 guangzhou
lily name4 guangzhou
name5 lishi hangzhou
name8 name6 shanghai
cross join,无条件连接,实际上跟不带where时一样得到的是笛卡尔?/p>
natural joinQ也可以直接CjoinQ,Ҏ(gu)表中同名栏位来连接记?若表中可能出现多个同名栏位,则用using(col_name)来指定所栏位。colname不能指定表的别名Q限制条件用on来指?br /> select id,p.sex,id,s.name from person p join student s using(id);
ID SEX ID NAME
---- ---- ---------- --------------------
1 boy 1 zhangshan
2 girl 2 name2
3 girl 3 lishi
4 boy 4 name4
5 girl 5 name5
在sql标准语法???q接用left(right) out join,限制条g用on可以了?/p>
full out join完全外连?思义是左外q接与右外连接都?br /> select id,p.sex,id,s.name from person p full join student s using(id);
ID SEX ID NAME
---- ---- ---------- ------------------
1 boy 1 zhangshan
3 girl 3 lishi
2 girl 2 name2
4 boy 4 name4
5 girl 5 name5
8 8 name8
6 6 name6
7 7 lily
译自:(x)http://mfm088.itpub.net/post/22599/250400
在Oracle/PLSQL中,lpad函数左边的字符串填充一些特定的字符Q其语法格式如下Q?nbsp;
lpad( string1, padded_length, [ pad_string ] )
其中string1是需要粘贴字W的字符?br />
padded_length是返回的字符串的数量Q如果这个数量比原字W串的长度要短,lpad函数会(x)把字W串截取?em>padded_length;
pad_string是个可选参敎ͼq个字符串是要粘贴到string1的左边,如果q个参数未写Qlpad函数会(x)在string1的左边粘贴空根{?br /> 例如Q?br />
lpad('tech', 7); | 返? tech' |
lpad('tech', 2); | 返?te' |
lpad('tech', 8, '0'); | 返?0000tech' |
lpad('tech on the net', 15, 'z'); | 返?nbsp;'tech on the net' |
lpad('tech on the net', 16, 'z'); | 返?nbsp;'ztech on the net' |