orcale 11g 操作总结
1、安装异常篇
1、安装教程可直接百度桌面类或者服务器类的教程
2、安装是如果提示不满足安装要求,可直接忽略或者在安装文件 ..stage\cvu 目录下的cvu_prereq.xml文件,内容中添加一个系统版本就行
如:我本地系统环境是WindowsServer2012R2,而数据库是orcale 11.2.0.1版本,此orcale版本发布时可能系统环境还未发布,所以在上述文件添加下面的内容
<OPERATING_SYSTEM RELEASE="6.2">
<VERSION VALUE="3"/>
<ARCHITECTURE VALUE="64-bit"/>
<NAME VALUE="WindowsServer2012R2"/>
<ENV_VAR_LIST>
<ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
</ENV_VAR_LIST>
</OPERATING_SYSTEM>
截图如下:

3、安装进行到创建数据库实例如果被卡在2%一直不动,出现这个问题的检查一下orcale的安装版本和服务器的处理器核数,orcale11.2.0.1对超过32核的服务器会出现这个错误,如果情况符合,提供2个解决方案
1、安装高版本的orcale数据库 如:orcale11.2.0.4版本
2、修改服务器处理器核数,操作:控制面板 -> 管理工具 -> 系统配置 -> 引导 附详细截图,按截图修改后,需要重新启动服务器。
注:如果orcale安装出现上述情况,建议删除后重新再安装

2、配置修改篇
1、数据库密码解除时间限制,默认密码有效期半年
1、查看用户的proifle是哪个(一般是default):
SQL> select username,profile from dba_users where username='user_name';
2、查看概要文件密码有效期设置:
SQL> select * from dba_profiles where profile='DEFAULT' and resource_name='PASSWORD_LIFE_TIME';
3、如果密码有效期被设置为180天,那么将需要进行如下修改:
SQL> alter profile default limit password_life_time unlimited
注意:修改后,还没有被提示ORA-28002警告的账户不会再碰到同样的问题,已经被提示的用户仍需要再修改一次密码,方法如下:
SQL> alter user user_name identified by password;
2、编码格式查看及修改
1、查看oracle当前编码格式:、
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET' ;
SELECT USERENV('language') FROM DUAL;
NLS_CHARACTERSET AL32UTF8
SIMPLIFIED CHINESE_CHINA.AL32UTF8
2、以sysdba身份登录
sqlplus / as sysdba
3、关闭数据库 shutdown immediate;
4、以mount打来数据库,startup mount
5、设置session
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
6、启动数据库
alter database open;
7、修改字符集
ALTER DATABASE CHARACTER SET ZHS16GBK;
提示我们的字符集:新字符集必须为旧字符集的超集:
ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
8、关闭,重新启动
shutdown immediate;
startup
3、空记录表设置表空间
1、设置原因:未分配表空间的空记录表在使用plsql工具导出时报ora00011错误(表不存在),使用exp.exe命令导出时不选择空记录表,最终导致导出的数据库不完整
2、管理用户登入
查看当前segment设置 show parameter deferred_segment_creation;
如果为true则修改为false alter system set deferred_segment_creation=false;
修改后新建立的空表会默认分配表空间
如果在修改配置之前就存在空表,执行以下操作
1、 查找所有数据表为空的表 select table_name from user_tables where NUM_ROWS=0;
2、把这些表组成修改Segment的脚本: select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
3、 将2中查询的结果导出来,或者复制出来,并执行修改所有空表。
3、数据备份篇
1、数据导出操作
1、plsql工具导出dmp格式,导出栏目选择orcale目录下的exp命令,如果点击导出弹出一个黑框后闪退则是因为未配置ORACLE_HOME环境变量,如:ORACLE_HOME=D:\app\product\11.2.0\dbhome_1

2、exp脚本导出dmp格式,赋以下参考脚本
@echo off
@set yearval=%date:~0,4%
@set monthval=%date:~5,2%
@set dayval=%date:~8,2%
@set logtime=%date%%time%
@set backup_path=d:\data
@set log_name=log-%yearval%%monthval%%dayval%.log
@set file_name=%yearval%%monthval%%dayval%
mkdir %backup_path%%file_name%
echo 开始导出数据库备份...,开始时间:%date%%time% >>%backup_path%%file_name%\%log_name%
exp user/password@orcl file=%backup_path%%file_name%\expfile.dmp
echo 结束导出数据库备份...,结束时间:%date%%time% >>%backup_path%%file_name%\%log_name%
echo 开始压缩文件...,开始时间:%date%%time% >>%backup_path%%file_name%\%log_name%
"C:\Program Files (x86)\WinRAR\WinRAR" a %backup_path%%file_name% %backup_path%%file_name% -r -ag[yyyy-MM-dd] -df
echo 压缩文件结束...,结束时间:%date%%time% >>%backup_path%%file_name%\%log_name%
3、注上述2种导出dmp格式时注意空记录表,解决方案可参考配置篇中对空记录表默认分配表空间的处理
4、补充:如果数据库中建立了函数,则把函数脚本复制,需要在新数据库内执行,执行时机可在新数据库创建好导入用户之后
2、数据导入篇
1、准备表空间,用户,分配权限
创建一个名为TEST的表空间,指定文件路径,文件名
CREATE TABLESPACE TEST
LOGGING DATAFILE 'D:\app\dut\oradata\tablespace/TEST.DBF'
SIZE 10000M
AUTOEXTEND ON
NEXT 100
EXTENT MANAGEMENT LOCAL;
创建临时表空间(TEST_TEMP)
CREATE SMALLFILE
TEMPORARY TABLESPACE "TEST_TEMP" TEMPFILE
'D:\app\dut\oradata\tablespace/TEST_TEMP.DBF' SIZE
500M REUSE AUTOEXTEND
ON NEXT 10240K MAXSIZE 32767M EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 1024K
创建用户(test)
create user test identified by test
--指定表空间(可不执行)
default tablespace TEST
temporary tablespace TEST_TEMP;
授权
grant connect,resource to test;
grant dba to test;
2、数据导入执行
(补充)使用导入用户登录新数据库,一次执行之前复制的函数脚本,如原数据库未建立函数,可忽略此步骤
imp test/test@orcl file=d:/expfile.dmp feedback=10000 buffer=1024000 indexes=y grants=y constraints=y commit=y compile=y log=d:\test.log fromuser=etest touser=test
test/test 导入用户/密码
file 导入文件路径
log 导入日志路径
fromuser 文件导出用户
touser 文件导入用户
3、导出异常处理
1、错误一
IMP-00058: 遇到 ORACLE 错误 1659
ORA-01659: 无法分配超出 1 的 MINEXTENTS (在表空间 USERS 中)
--users表空间满了,想办法释放下
2、错误二
IMP-00003: 遇到 ORACLE 错误 959
ORA-00959: 表空间 'xxxx’ 不存在
--需要创建对应表空间,对应表数据重新导入
3、错误三
IMP-00003: 遇到 ORACLE 错误 1917
ORA-01917: 用户或角色 'xy' 不存在
--创建用户
4、错误四
IMP-00041: 警告: 创建的对象带有编译警告
出现这个错误一般在执行导入dmp格式数据库文件内包含触发器,而触发器内的函数没有建立,导致触发器编译不成功,此警告不会终止导入,在结束导入之后也可处理此问题
--可使用sql developer 登录原导出用户,将所有的函数脚本复制,然后登录新用户将复制的函数脚本一一执行,执行之后可选中函数选项右击刷新进行查看,最后选中触发器选项右击编译所有项
5、错误五
导出数据库编码与导入数据库编码需要相匹配,否则会出现字段长度异常的问题,一般将导入的数据库编码修改为导出数据库的编码,修改编码参考配置篇
4、锁表处理篇
1、通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
1、用dba用户执行以下语句
select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object)
如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
2、用dba用户执行以下语句,可以查看到被死锁的语句。
select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in (select session_id from v$locked_object))
2、死锁的解决方法
一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。
1、查找死锁的进程:
sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS ,'alter system kill session ''' || l.SESSION_ID || ',' || s.SERIAL# || ''';'
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
2、kill掉这个死锁的进程:
alter system kill session '6,220'; (其中sid=l.session_id)
3、如果还不能解决:
select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
其中sid用死锁的sid替换: exit
ps -ef|grep spid
其中spid是这个进程的进程号,kill掉这个Oracle进程
3、锁表处理
第一步 查询锁表语句
select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in (select session_id from v$locked_object));
第二步 查询锁表进程号
SELECT s.username, l.OBJECT_ID,l.SESSION_ID, s.SERIAL#, l.ORACLE_USERNAME, l.OS_USER_NAME, l.PROCESS,
'alter system kill session ''' || l.SESSION_ID || ',' || s.SERIAL# || ''';' FROM V$LOCKED_OBJECT l, V$SESSION S
WHERE l.SESSION_ID = S.SID;
第三步 执行语句
5、后续补充篇
遇到以上问题朋友可参照上述解决方案尝试解决或者留言讨论,希望能帮上忙
浙公网安备 33010602011771号