Oracle DBA 摘录 Chapter1-4

来源:互联网 发布:js判断对象是否为数组 编辑:程序博客网 时间:2024/06/07 04:43

最近在看杨建荣编著的Oracle DBA工作笔记,颇有所得吧。

Chapter1.数据库安装配置

1.    查看内存情况(root):grep MemTotal /proc/menifo

2.    查看swap情况(root):grep SwapTotal /proc/menifo

3.    查看磁盘空间(root):df -k或df -h

4.    /tmp目录空间大于400M:

df -h /tmp

FilesystemSize Used Avail Use% Mounted on

/dev/shm         16G  0  16G   0% /tmp

5、 检查内核版本(root):uname -r

6、 检查软件包的安装情况(root):rpm -qa|grep 软件包名

7、 环境配置(root),创建用户和用户组:(1)创建用户组oinstall——groupadd oinstall (2)创建用户组DBA——groupadd dba (3)设定安全策略,允许修改配置——chattr -i /etc/passwd/etc/shadow (4)把用户oracle加入oinstall和dba组——useradd-g oinstall -G dba oracle (5)开始修改密码——passwd oracle (6)创建用户完成,设定配置文件权限,避免信息篡改——chattr +I /etc/passwd /etc/shadow

8、 配置Linux内核参数(root),修改/etc/sysctl.conf文件,修改后sysctl -p设置生效。

9、 配置资源使用情况(root):

(1)修改/etc/security/limits.conf文件

# oracle

oracle        soft    nproc    2047

oracle        hard   nproc    16384

oracle        soft    nofile    1024

oracle        hard   nofile    65536

(2)在/home下创建U01目录:mkdir/home/U01

(3)创建软链接绑定:ln -s /home/U01 /U01

(4)创建相应的目录结构:mkdir -p/U01/app/oracle

(5)对目录指定用户组:chown -Roracle:oinstall /U01/

(6)赋予指定的目录权限:chmod -R 775 /U01/

(7)修改/etc/pam.d/login文件,增加以下内容:session required pam_limits.so

10、   配置环境变量

假设数据库实例名为test,修改.bash_proifle文件

export ORACLE_BASE=/U01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.4/db_1

export ORACLE_SID=test

export PATH=$ORACLE_HOME/bin:

$ORACLE_HOME/OPatch:

$ORACLE_HOME/jdk/bin:$PATH

export LANG=”en_US.UTF-8”

export NLS_LANG=American_AMERICA.UTF8

export NLS_DATE_FORMAT=”YYYY-MM-DD HH24:MI:SS”

11、   安装数据库软件

(1)OUI安装:图形界面操作

(2)静默安装:

配置响应文件的设置,参考如下:

oracle.install.option=INSTALL_DB_SWONLY  -只选择安装软件

ORACLE_HOSTNAME=racl               -对应服务器名称

UNIX_GROUP_NAME=dba               -对应系统用户组

INVENTORY_LOCATION=/home/oracle    -Inventory目录

SELECTED_LANGUAGES=en,zh_CN,th,zh_TW -安装语言

     oracle.install.db.InstallEdition=EE           -安装类型选择

     oracle.install.db.optionalComponents=……  -需要安装的组件

     安装时,命令如下:

[oracle@racl databse]$ ./runInstaller -silent -responsefile/home/oracle/new.rsp -ignoreSysPreregs

Starting Oracle Universal Installer…

在11g中用的是responseFile而不是responsefile

(3)克隆安装

(a).11g环境中,$ORACLE_HOME/clone/bin下,ORACLE_HOME和ORACLE_HOME_NAME需用实际路径。

$ perl clone.pl ORACLE_BASE=/U01/app/oracle ORACLE_NAME=/U01/app/oracle/product/11.2.0.2/db_1  ORACLE_HOME=OraDb10g_home1

(b)10g环境中

$ORACLE_HOME/oui/bin/runInstaller -clone -silent -ignorePreReqORACLE_HOME=”$ORACLE_HOME” ORACLE_HOME=”OraDb10g_home1”

克隆安装后无法登录的问题: $ sqlplus / as sysdba报错:ORA-01031:insufficientprivileges,而使用sysoper就没有问题。是由于主库中有dba,而备库中没有,只需要在备库中创建一个对应的用户组,然后把Oracle用户加入dba组中。

#group add

#usermod -a -G dba oracle

#id oracle

Uid=501(oracle) gid=501(oinstall) groups=501(oinstall),505(dba)

然后重新relink操作使用安装克隆的部分,且删除inventory.xml中的$ORACLE_HOME即可。

12、   创建数据库

(1)DBCA图形建库

(2)手动建库 create databaseTEST

                 maxinstances 1

                 maxlogfiles 20

                 maxlogmembers 5

                 maxdatafiles    999

                 character set AL32UTF8

                 ……

(3)DBCA静默建库

dbca -silent -createDatabase -templateName$ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc – gdbname newtest-sid newtest -characterSet UTF8

(4)OMF建库,

SQL> startup nomount --启动数据库到nomount阶段

ORACLE instance started.

SQL> create database; --创建数据库实例

Database created.

13、   创建数据库用户

创建用户可以通过DBMS_METADATA来生成DDL语句,该方式高效简洁。例如,想要得到用户名含有TEST字样的创建用户语句和权限信息:

Select dbms_metadata.get_ddl(‘USER’,u.username)from dba_users u where username like ‘%TEST%’;

Select dbms_metadata.get_granted_ddl(‘SYSTEM_GRANT’,u.username)from dba_users u where username like ‘%TEST%’;

Select dbms_metadata.get_granted_ddl(‘ROLE_GRANT’,u.username)from dba_users u where username like ‘%TEST%’;

14、   删除数据库

SQL>drop database;

出现ORA-01586:database mustbe mounted EXCLUSIVE and not open for this operation,so应该重启数据库到mount阶段

SQL>alter database mount exclusive;

然后执行drop database命令

出现ORA-12719:operation requiresdatabase is in RESTRICTED mode,so应该

SQL>alter system enable restricted session;

这样再去执行drop database命令就会把所有数据文件、控制文件、日志文件等物理文件都删除。

15、   SYSDBA、SYSOPER、DBA的区别和联系

(1)SYSDBA和SYSOPER有相同的可执行操作:启动关闭数据库,修改数据库为打开、挂载模式,备份数据库,创建服务器参数文件、设置数据为归档模式、数据恢复等,而SYSDBA还可以修改字符集,创建数据库,修改数据库。而DBA角色主要包括创建表、视图、索引等明细权限,SYSDBA可以做数据库级的任何操作。   

(2)SYSDBA对应用户是SYS,而SYSOPER对应用户是PUBLIC

 (3)SYS,SYSTEM用户都是数据库创建时内置的用户,SYS对应SYSDBA系统权限,默认密码是CHANGE_ON_INSTALL.SYSTEM绑定的是DBA角色,默认密码是MANAGER.如果用SYS直接登录,而不使用SYSDBA则会报ORA-28009的错。如果将SYS用户as SYSDBA,没有密码文件也会报ORA-01031的错。因此,需要创建密码文件:

$ orapwd password=oracle file=orapwdTEST01entries=2

值得注意的是在Linux和Windows下的命令区分:

Linux:orapw<ORACLE_SID>Window:pwd<ORACLE_SID>.ora

(4)使用操作系统级的验证方式登录,默认使用SYSDBA权限。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

Chapter2常用工具和问题分析

1、oerr,比如查看ORA-00001的问题,可以通过oerr ora 00001的命令

2、Sqlplus:增input 删delete 改change查list

 主要用到的命令有C/old/new替换、CL BUFF删除所有行、DEL或者DEL*删除当前行

I或i增加一行或多行、L或者;或者l 显示SQL buffer中的行

3、sqlplus无法正常启动的原因:

(1)常见原因

      A.SELinux导致无法启动,解决方式有两种:一是直接使用root执行setenforce 0或者在Linux页面关掉SELinux。二是在/etc/sysconfig/selinux中修改SELINUX=disabled,然后重启。

B.环境变量设置不当导致

C.Profile失效导致,文件.bash_profile中$       ORACLE_BASE,$ORACLE_HOME前面的export都消失了,应着重检查

    (2)特殊原因

A.乱码导致。$ORACLE_HOME正确的情况下,查看参数文件的格式,很有可能经过不同系统中转时格式化错误,参数文件的名字不再是.sh .ksh之类的名字

B.Strace诊断问题。日志中已经去查找主机名了,但是/etc/hosts中查看确实没有。

 

Chapter3.服务器连接配置

1、监听配置与客户端配置。Oracle默认开启1521端口提供对外服务,因为安全、环境、规范等因素,很可能不会使用默认端口。可以通过配置多个指定的端口,主要通过listener.ora来配置监听器,通过网络配置助手netca来图形化配置监听,使用命令lsnrctl来启停监听器。客户端访问主要通过配置本地命名服务来实现,也就是对应tnsnames.ora这个文件。

 

2、监听配置文件格式的探究——一个空格的威力

案例一:

LISTE1= -行头存在一个空格

(DESCRIPTION=

     (ADDRESS_LIST=

(ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521))

)

)

SID_LIST_LISTE1=

(SID_LIST=

       (SID_DESC=

              (GLOBAL_DBNAME=PROD)

              (ORACLE_HOME=…………)

(SID_NAME=PROD)

)

)

启动的时候非常缓慢,然后报没有监听liste1的错误,与没有listener.ora的情况直接监听的结果相同。

 

案例二:

LISTE1=

(DESCRIPTION=

  (ADDRESS_LIST=

(ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521))

) -行头存在一个空格

)

SID_LIST_LISTE1=

(SID_LIST=

       (SID_DESC=

              (GLOBAL_DBNAME=PROD)

              (ORACLE_HOME=…………)

(SID_NAME=PROD)

) -行头没有空格

)

启动的时候就会报sid_list_liste1有问题,把空格加上即能正确启动。

 

案例三:

LISTE1=

(DESCRIPTION=

  (ADDRESS_LIST=

(ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521)

) -行头没有空格

) -行头存在一个空格

)

启动的时候也会报错,改成如下两种形式即可:

(ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521))

或者

(ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521)

)-行头存在一个空格

 

同样,listener.ora的情况在tnsnames.ora也相同,报的都是ORA-12154的错,都是因为空格导致的,有可能是PROD行头存在空格,也有可能是括号缺少空格。

 

3、 RAC中的TAF配置,TAF是Oracle中对应用透明的故障转移

(1)    Failover Method有preconnect和basic两种。

简单来说,basic方式会在故障发生时才会判断,而preconnect则是未雨绸缪,实际来说,basic更加通用,是默认的故障转移方式

(2)    Failover Type 有select和session两种

Select就是完成故障切换,继续处理未完成的操作。

Session就是直接断开连接,重新请求完成。

4、 监听器无法启动的几个原因

(1)/etc/hosts配置问题,有可能误删了127.0.0.1的默认记录,添加默认记录

127.0.0.1 localhost

(2)/var/tmp/.oracle权限问题或盲目清理。一般出现permission denied都是权限不足导致,修改用户权限或者切换用户均可解决。有些情况下,清理/var/tmp/.oracle中的内容,RAC实例会直接宕掉或者出现ASM异常。

(3)listener.ora配置问题,注意空格即可。

(4)系统资源不足,可考虑调大limits设置等。

5、客户端TNS-12543的错误。用tnsping给几个数据库环境做连接验证,客户端的一个库总是报TNS-12543的错误,能够ping通,但是直连就报错,很有可能就是防火墙或者其他网络配置的问题,可以去查看一下是否防火墙对某个端口的限制。

  使用tnsping解析连接串时,无法控制超时的情况,默认是取操作系统级的设置1分钟,如果有大批量的连接串需要检测IP和端口,可以考虑nc来设定超时,参考命令:

 Nc -w 2 -v192.168.97.17 1521|grep succ

 

Chapter4.数据库启停和宕机问题

1、 启停的过程:SHUTDOWN->NOMOUNT->MOUNT->OPEN

2、 数据库无法启动的原因可以从以下两个方面考虑

(1)    系统内核参数设置不当(2)数据库参数设置不当

 

NO1:数据库参数设置不当

ORA-00838:Specified value of MEMORY_TARGET is toosmall,needs to be at least13920M.

解决办法:禁用MEMORY_TARGET,采用SGA_TARGET管理方法;调整MEMORY_TARGET和SHARED_POOLA的值,控制在合理范围,需要注意的是MEMORY_TARGET的设置需要重启数据库实例。

 

NO2:服务器增加内存,内核参数受影响

ORA-27102:out of memory

问题很可能与‘locked memory’设置过低有关,默认32KB,可以在/etc/security/limits.conf中调整memlock。

 

NO3:数据库shutdown

ORA-27301:OS failure message:No space left on device

添加数据库实例的时候,有些process配置不合理,用不了那么多,可适当调整。

 

NO4:RAC节点无法启动的ORA-29702问题

ORA-29702:error occurred in ClusterGroup Service operation

解决方式:一是手动杀掉那些CRS进程,二是打上相应的PSU

3、 数据库无法登录的原因大致有以下四种:

(1)    资源使用溢出

(2)    内核参数设置不当

(3)    存储空间不足

(4)    应用设计问题

NO1.归档空间不足导致

ORA-09817:write to audit filefailed

简单来说就是审计日志写不进去,磁盘空间不足。

(如果数据库因为磁盘空间无法登录,查看不了审计日志的路径,可以通过$ORACLE_HOME/dbs下的参数文件来查找审计日志的路径)

解决办法:一是制定归档删除策略,进行定时压缩和定时删除,二是查看是什么操作生成了大量的redo,是否可以减少redo的生成量。

 

NO2.Session Leak导致

ORA-12541:TNS:no listner

ORA-12536:TNS:operation would block

原因:开发过程中业务是等待都处理完了再提交的,导致大量session运行着同样的sql语句,从数据库层面看到的情况就是这些会话被阻塞了。

 

NO3.undo缺失

客户端ORA-01033:ORACLE initialization or shutdown in progress

alert日志中显示undo文件丢失,库根本没起来。

SQL>select open_mode from v$database;

从备份中拿到undo来做恢复,问题得以解决。

 

4、数据库宕机问题和原因

(1)Oracle bug导致的宕机。如一条SQL语句alter system set sga_target=12G

(2)存储导致的宕机

(3)内存不足导致的宕机

(4)I/O问题导致的宕机

(5)网络问题导致的宕机


原创粉丝点击