LINUX下ORACLE操作中常见问题
通过本人在实践中遇到的问题,希望能帮助大家解决一些问题!
一、ORACLE安装报错信息:
ORALCE 10G:
1、检查环境时报checking for oracle home incompatibilties
原因:安装时有DB_1下有文件,必须清空或者删除DB_1
2、安装到最后执行两个脚本后报错oui-10058
原因:有可能先以ORACLE用户执行了两个脚本,此时只需要删除rm -rf /etc/oraInst.loc 文件即可
3、-bash: dbca: command not found
原因:ORACLE_HOME路径有问题,先用echo $ORACLE_HOME
ORACLE 11G:
1、包的依赖性问题!
解决方法:rpm 加--froce --nodeps,或者使用yum命令安装,yum install 包名
2、软件远程安装问题
解决方法:export DISPLAY=:0.0
3、安装完后执行lsnrctl、 status报sqlplus: error while loading shared libraries: /u01/app/oracle/product/11.1.0/db_1/lib/libnnz11.so: cannot restore segment prot after reloc: Permission denied
解决方法:/etc/sysconfig/selinux 文件的内容为 SELINUX=disabled,然后重启服务器
4、在 /etc/profile中不需要增加文件
5、如果在单实例中报ORACLE NETWORK TIME PROTOCOL FAILED。
解决方法:--解决包ntp 失败:
停用ntpd时间同步(oracle会使用内部的时间同步机制CTSS):
# /sbin/service ntpd stop
# chkconfig ntpd off
# mv /etc/ntp.conf /etc/ntp.conf.original
6、task resolv.conf integrity
解决方法: --这个是因为无法访问设置的DNS ip,对安装没影响可以忽略
7、安装好后ORACLE11GR211.2.0.1后用IMPDP导入数据报ORA-39083: Object type INDEX failed to create with error:
ORA-14102: only one LOGGING or NOLOGGING clause may be specified,ORA-39083: Object type INDEX failed to create with error:
解决方法:是ORACLE此版本IMPDPBUG,需要安装ORACLE11GR211.2.0.3以上版本方可解决,也有人安装对应补丁,但是本人试过不行。
二、LINUX下问题
1、解决SSH连接linux中文显示乱码问题
解决方法:编辑/etc/sysconfig/i18n,vi /etc/sysconfig/i18n
将其中的 LANG="zh_CN.UTF-8" 改为 LANG="zh_CN.GB2312" 。
2、如何修改linux主机名才能生效
解决方法:
第一步:
#hostname oratest
第二步:
修改/etc/sysconfig/network中的hostname
第三步:
修改/etc/hosts文件
3、裸设备上和文件系统拷文件
裸设备上拷文件
dd if=/dev/raw/raw45 f=/home/oracle/test.dbf
从文件系统到裸设备
dd if=/oradata/test.dbf of=/dev/rlv_data
4、查看LVM
PVDISPLAY
VGDISPALY
LVDISPALY
5、定时执行脚本
可以用crontab -e
6、Oracle在Linux内核参数的修改实例:
kernel.core_uses_pid = 1
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144
ore_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
服务器内存为4G的情况下
修改/etc/sysctl.conf文件 (ROOT账户)
kernel.shmmax = 2147483648
//公式:2G*1024*1024*1024=2147483648(字节)
//表示最大共享内存,如果小的话可以按实际情况而定,一般为物理内存的一半,大一点也可以(单位:字节)
kernel.shmmni=4096
//shmmni 内核参数是共享内存段的最大数量(注意这个参数不是 shmmin,是
shmmni, shmmin 表示内存段最小大小 )。shmmni 缺省值 4096 ,一般肯定是够用了。
kernel.shmall=1048576
//kernel.shmall 参数是控制共享内存页数 。Linux 共享内存页大小为4KB, 共享内存段的大小都是共享内存页大小的整数倍。公式:4G*1024*1024/4K = 1048576(页) 查看内存页大小方法#getconf PAGESIZE
//kernel.shmall:表示可用共享内存的总量,单位是页,在32位系统上一页等于4kB,也就是4096字节。
kernel.sem=250 32000 100 128
//4个参数依次是SEMMSL:每个用户拥有信号量最大数,SEMMNS:系统信号量最大数,SEMOPM:每次semopm系统调用操作数,SEMMNI:系统辛苦量集数最大数。这4个参数为固定内容大小
fs.file-max=65536
//在linux下面如果报告:too many file opened,就需要增加系统允许打开的文件数。file-max固定大小65536
net.ipv4.ip_local_port_range=1024 65000
//ip_local_port_range表示端口的范围,为指定的内容
kernel.sem:表示设置的信号量,这4个参数内容大小固定。
net.core.rmem_default:表示接收套接字缓冲区大小的缺省值(以字节为单位)。
net.core.rmem_max :表示接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_default:表示发送套接字缓冲区大小的缺省值(以字节为单位)。
net.core.wmem_max:表示发送套接字缓冲区大小的最大值(以字节为单位)
以上步骤做完执行 /sbin/sysctl -p 使内核生效
验证参数(root账户执行):
#/sbin/sysctl -a | grep shm
#/sbin/sysctl -a | grep sem
#/sbin/sysctl -a | grep file-max
#/sbin/sysctl -a | grep ip_local_port_range
7、检查硬盘
fsck -t ext3 -r /dev/mapper/mapath01
-t:文件类型,-r:自动修复
检查块:badlocks -s -w /dev/mapper/mapath01
-s:显示进度,-w:写入测试(注意如果加写入测试会把分区搞成逻分区,使用时需要格式化后再挂载,数据会丢失)
8、客户端无法SSH登陆,服务端报bad plaintext length 337 [failed]
解决方法:删除etc/ssh/ssh_host_key文件,rm -rf ssh_host*,再重启服务
service sshd restart
待续....
三、ORACLE的使用
1、 数据迁移自动生成创建用户和权限脚本
生成用户权限脚本:
undefine user_name
set pagesize 1000
select 'grant '||tt.granted_role||' to '||tt.grantee||';' as SQL_text
from dba_role_privs tt where tt.grantee=(upper('&&user_name'))
union all
select 'grant '||tt.privilege||' to '||tt.grantee||';'
from dba_sys_privs tt where tt.grantee=(upper('&&user_name'))
union all
select 'grant '||tt.privilege||' on '||owner||'.'||table_name||' to '||tt.grantee||';'
from dba_tab_privs tt where tt.grantee=(upper('&&user_name'))
union all
select 'alter user '||tt.user_name||' quota '||maxblocks*blocksize||' on '||ts_name||';'
from KU$_TSQUOTA_VIEW tt where tt.user_name=(upper('&&user_name'));
生成创建用户和权限脚本:
set serveroutput on size 1000000
set verify off
undefine user_name
declare
v_name varchar2(30) := upper('&user_name');
no_grant exception;
pragma exception_init( no_grant, -31608 );
begin
dbms_metadata.set_transform_param(dbms_metadata.SESSION_TRANSFORM, 'SQLTERMINATOR', TRUE);
dbms_output.enable(1000000);
dbms_output.put_line(dbms_metadata.get_ddl('USER',v_name));
begin
dbms_output.put_line(dbms_metadata.get_granted_ddl('SYSTEM_GRANT',v_name));
exception
when no_grant then dbms_output.put_line('– No system privs granted');
end;
begin
dbms_output.put_line(dbms_metadata.get_granted_ddl('ROLE_GRANT',v_name));
exception
when no_grant then dbms_output.put_line('– No role privs granted');
end;
begin
dbms_output.put_line(dbms_metadata.get_granted_ddl('OBJECT_GRANT',v_name));
exception
when no_grant then dbms_output.put_line('– No object privs granted');
end;
begin
dbms_output.put_line(dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA',v_name));
exception
when no_grant then dbms_output.put_line('– No tablespace quota specified');
end;
dbms_output.put_line(dbms_metadata.get_granted_ddl('DEFAULT_ROLE', v_name ));
exception
when others then
if SQLCODE = -31603 then dbms_output.put_line('– User does not exists');
else raise;
end if;
end;
/
例如:
SQL_TEXT
--------------------------------------------------------------------------------
grant CONNECT to HS_FUTURES;
grant RESOURCE to HS_FUTURES;
grant DBA to HS_FUTURES;
grant SELECT ANY TABLE to HS_FUTURES;
grant CREATE TABLE to HS_FUTURES;
grant UNLIMITED TABLESPACE to HS_FUTURES;
CREATE USER "HS_FUTURES" IDENTIFIED BY VALUES 'D0FF61485E7DB3D6' //VALUES 'D0FF61485E7DB3D6'可改成用户密码
DEFAULT TABLESPACE "HS_FUTURES_DATA"
TEMPORARY TABLESPACE "TEMP";
GRANT SELECT ANY TABLE TO "HS_FUTURES";
GRANT CREATE TABLE TO "HS_FUTURES";
GRANT UNLIMITED TABLESPACE TO "HS_FUTURES";
GRANT "CONNECT" TO "HS_FUTURES";
GRANT "RESOURCE" TO "HS_FUTURES";
GRANT "DBA" TO "HS_FUTURES";
2、一组增加两个V$LOGFILE文件
alter database add logfile member '/u01/oracle/oradata/ora10g/redo04a.log' to group 4;
alter system switch logfile;
3、dblink配置
在目标端(168.88.0.8)创建DBLINK :
用dsg用户登录目标端的机器
$sqlplus “/as sysdba”
SQL> create database link xbqhdb connect to dsg identified by xbqh2008 using '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 168.88.0.5)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = xbqhrac)(INSTANCE_NAME = xbqhrac2)))';
这样DBLINK创建成功。
如果要比对源端和目标端hs_futures.holdsinfo表的内容是否一致,可通过如下比:
SQL> select * from [size=14px]mailto:HS_HIS.HISFUASSETTOT@xbqhdb]HS_HIS.HISFUASSETTOT@xbqhdb where open_date =20090705 minus select * from hs_futures.holdsinfo where open_date =20090705
删除:
DROP DATABASE LINK XBQHDB
如果要比对其他的表只需要改表名就行了。
当然如果DBLINK是用sys用户建的 比对内容就在sys用户下比对。如果是用其他用户建的就在其他用户下比对。
alter session close database link
dbms_session.close_database_link(
4、ORACLE中的DUMP转储方法
DUMP出控制文件
alter system (session) set events 'immediate trace name controlf level 10'
—————————————————————————————
DUMP出日志文件分析
alter system dump logfile logfilename;
—————————————————————————————
DUMP出日志文件头分析
alter session set events 'immediate trace name REDOHDR level 10'
———————————————————————————
DUMP出LIBRARY CACHE
alter system (session) set events 'immediate trace name library_cache level 10'
—————————————————————————————
DUMP出share_pool
alter system (session) set events 'immediate trace name heapdump level 10'
———————————————————————————
DUMP出所有数据文件头
alter system (session) set events 'immediate trace name file_hdrs level 10';
———————————————————————————
DUMP出数据文件(只能是alter system)
alter system dump datafile n block m
如
select file_id,block_id,blocks from dba_extents where segment_name='EMPLOYEES'
FILE_ID BLOCK_ID BLOCKS
---------- ---------- ----------
5 81 8
SQL>; alter system dump datafile 5 block 81;
System altered.
另外是做很具体的针对某行所在的BLOCK 并DUMP出来研究,可以用如下方法
取BLOCK号
select dbms_rowid.rowid_block_number(rowid) from wdjk1999;
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
78
取文件号
select file_id from dba_data_files where tablespace_name='WDJK1999'
FILE_ID
----------
16
SQL> alter system dump datafile 16 block 78;
System altered.
—————————————————————————
DUMP出索引
SQL> select object_id from dba_objects where object_name=upper('index_name');
OBJECT_ID
----------
70591
SQL> ALTER SESSION SET EVENTS 'immediate trace name TREEDUMP level 70591';
—————————————————————————————
DUMP出回滚段信息
select xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn,ubarec from v$transaction;
XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC
---------- ---------- ---------- ---------- ---------- ---------- ----------
1 31 442 2 21 242 52
dump对应的undo block
[size=14px]]alter">SYS@ning>alter system dump datafile 2 block 21;
System altered.
5、SQLPLUS中表列显示的设置
set line 200
set pagesize 200
col 字段名 format a数字
aXX是设置字符型的字段如果这列都是整数所以你可以用: col 列名 format 999999999999的个数代表你这个整数字段的最大长度。
6、使用中发现的ORACLE-BUG
setting 3-way cp grants to 1 global-lru off ? 0
解决:Oracle给出的描述是:
类型 B - Defect 已在产品版本中修复 - 严重性 4 - Minor Error, No Loss of Service 产品版本 10.2.0.3 状态 32 - Not a Bug. To Filer 平台 212 - IBM AIX on POWER Systems (64-bit)Oracle也认为这是可以忽略的信息,可以看到,基本上所有版本的10203上都会出现这个问题。
Media recovery not enabled or manual archival only 0x10000
解决:
These messages were added for debugging purpose and can be ignored.
Delete these files manually or use some job to clean up diskspace.
At the time of writing this note , there isn't any one-off patch to fix this issue on 10.2.
You can always raise a new SR requesting for a backport fix on top of 10.2 for your platform
今天随便打开一个trace file 的时候,发现里面有大量的“AUTO SGA: Not free ”
于是,检查SGA/内存使用情况等等,没发现任何异常,最后向METALINK 发TAR ,
发现是个BUG ,并不是因为SGA 真的不够了。
*** 2007-02-06 21:00:04.582
*** SERVICE NAME:(SYS$BACKGROUND) 2007-02-06 21:00:04.577
*** SESSION ID:(388.1) 2007-02-06 21:00:04.577
AUTO SGA: Not free 0x70000016df8dc18, 1, 1, 1
AUTO SGA: Not free 0x70000016df8dc18, 1, 1, 1
AUTO SGA: Not free 0x70000016df8dd18, 1, 1, 1
AUTO SGA: Not free 0x70000016df8de18, 1, 1, 1
AUTO SGA: Not free 0x70000016df8df18, 1, 1, 1
AUTO SGA: Not free 0x70000016df8e018, 1, 1, 1
AUTO SGA: Not free 0x70000016df8e118, 1, 1, 1
AUTO SGA: Not free 0x70000016df8e218, 1, 1, 1
AUTO SGA: Not free 0x70000016df8e318, 1, 1, 1
AUTO SGA: Not free 0x70000016df8e418, 1, 1, 1
This is due to Bug 5201883 - UNEXPLAINED MMAN TRACE FILE in 10.2.0.2 and 10.2.0.3
CAUSE JUSTIFICATION
===================
Bug 5201883 - UNEXPLAINED MMAN TRACE FILE in 10.2.0.2 and 10.2.0.3
PROPOSED SOLUTION(S)
====================
Please apply the patch for Bug 5201883 - UNEXPLAINED MMAN TRACE FILE in 10.2.0.2 and 10.2.0.3 by downloading it fro metalink.
PROPOSED SOLUTION JUSTIFICATION(S)
==================================
This is due to bug. This does not indicate that SGA is insufficient. As such these
errors can be ignored.
SOLUTION / ACTION PLAN
======================
-- To implement the solution, please execute the following steps::
Please apply the patch for Bug 5201883
7、不正常关闭数据库导致CRS中DB实例状态变为restore,使数据库实例无法在CRS中开机启动
解决方法:crsctl modify resource ora.asp1.db -attr "AUTO_START=always"
8、关闭ORACLE RAC的最快最有效的方法
srvctl stop database -d asp
crs_stop -all
9、数据坏块检测
dbv
待续。。。。。