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、后续补充篇

     遇到以上问题朋友可参照上述解决方案尝试解决或者留言讨论,希望能帮上忙

posted @ 2019-12-11 11:00  风小白  阅读(430)  评论(0)    收藏  举报