在 Database 分类下的文章

一次由MySQL跨库操作所引发的主从复制中断

今天,所有MySQL从服务器上的主从复制都被异常中断了,登陆到其中一台上执行show slave status\G,发现如下错误:

Last_Error: Error ‘Operation DROP USER failed for ‘guest’@’localhost” on query. Default database: ‘work’. Query: ‘drop user ‘guest’@’localhost”

也就是说,是 drop user ‘guest’@’localhost’ 这条命令导致的,而这样的操作我们通常都只会在Master上进行,并且该操作应该只会影响到“mysql”这个系统数据库。之前这种操作进行了很多次,可为什么唯独这一次会出问题呢?
经过一番调查之后,最终找到了问题的根源,那就是,
“binlog-do-db, binlog-ignore-db, replicate-do-db, replicate-ignore-db” 这一类参数,并非想象中可靠!

通常,我们会以为只要设定了以上参数,MySQL的主从复制就会只对我们设定的数据库生效。但事实上,MySQL不是根据内容来判断的,而是很傻瓜的根据你执行了“use work”或在初始连接时指定的数据库来判断的。
而这次,我们在执行drop user之前,因为需要从“work”数据库select一些数据,就use work进入到了work数据库,而大家都知道在执行drop user的时候是不需要进入“mysql”这个系统数据库的,所以就直接执行了drop user,但因为MySQL的判断我们是在use work之后执行的,所以认为是针对“work”数据库的操作就同步了下去,而从服务上都是没有guest@localhost这样的用户的,所以就造成了错误,导致主从复制的中断。

因此,在有主从复制架构的MySQL服务器环境中,我们要尽量避免这样的跨库操作,确保是在执行了正确的use dbname之后再执行命令。

这类故障的恢复方案很简单,就是跳过这一条SQL。

stop slave;
set global sql_slave_skip_counter=1;
start slave;
show slave status\G

参考资料:
http://www.mysqlperformanceblog.com/2009/05/14/why-mysqls-binlog-do-db-option-is-dangerous/

2 Comments

MySQL 5.5.x 单机多实例配置实践

背景/需求:
在一台服务器上通过源码编译安装一个版本为5.5以上的MySQL数据库;
将所有配置文件与数据等均存放在/opt/mysql,便于今后实现快速迁移、整体备份和快速复制;
在同一个MySQL中运行两个实例,一个绑定在端口3306,另一个绑定在端口3307;
绑定在3306端口的实例,不开启binlog,数据存放在/opt/mysql/data;
绑定在3307端口的实例,开启binlog,数据存放在/opt/mysql/data2;
两个实例均采用InnoDB作为默认的存储引擎,字符编码采用UTF-8;
两个实例均采用相同的性能优化配置参数;

实践/方案:
在编译安装时,将数据库的配置文件my.cnf以及data目录等均指向到/opt/mysql目录;
通过mysqld_multi的方式来管理两个不同的实例,采用相同的配置文件共享性能优化配置参数;
在同一个配置文件中,利用[mysqld1]与[mysqld2]标签实现不同实例的差异化配置;

配置步骤:
一、编译安装MySQL
1.安装cmake
MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具。
因此,我们首先要在系统中源码编译安装cmake工具。
# wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz

# tar zxvf cmake-2.8.4.tar.gz

# cd cmake-2.8.4

# ./configure
# make
# make install

2.确保以下所需系统软件包已经被安装
通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。

gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libgcrypt* libtool*

如果缺少相关的软件包,可通过yum -y install 的方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh 的方式安装。

3. 安装前的系统设置
建立mysql安装目录及数据存放目录
# mkdir /opt/mysql
# mkdir /opt/mysql/data

创建用户和用户组
# groupadd mysql
# useradd -g mysql mysql

赋予数据存放目录权限
# chown mysql:mysql -R /opt/mysql/data

4.开始编译安装 MySQL
通过http://www.mysql.com/downloads/mysql官方网址或国内的sohu镜像下载软件包,如目前最新的MySQL 5.5.20。
# wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.20.tar.gz

# tar zxvf mysql-5.5.20.tar.gz

# cd mysql-5.5.20
# cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql \
-DSYSCONFDIR=/opt/mysql/etc \
-DMYSQL_DATADIR=/opt/mysql/data \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
-DMYSQL_USER=mysql \
-DEXTRA_CHARSETS=all \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1

# make
# make install

在make与make install的时候可以看到进度百分比,感觉这一点要比configure方式要好。

二、创建支持多实例的配置文件
进入MySQL主目录
# cd /opt/mysql/

删除默认的data目录
# rm -rf data

创建需要的目录
# mkdir etc tmp run log binlogs data data2
# chown -R mysql:mysql tmp run log binlogs data data2

创建my.cnf配置文件
# vim etc/my.cnf

## This server may run 2+ separate instances
## So we use mysqld_multi to manage their services
[mysqld_multi]
mysqld = /opt/mysql/bin/mysqld_safe
mysqladmin = /opt/mysql/bin/mysqladmin
log = /opt/mysql/log/mysqld_multi.log
user = root ## Used for stopping the server via mysqladmin
#password = 

## This is the general purpose database
## The locations are default
# They are left in [mysqld] in case the server is started normally instead of by mysqld_multi
[mysqld1]
socket = /opt/mysql/run/mysqld.sock
port = 3306
pid-file = /opt/mysql/run/mysqld.pid
datadir = /opt/mysql/data
lc-messages-dir = /opt/mysql/share/english

## These support master - master replication
#auto-increment-increment = 4
#auto-increment-offset = 1  ## Since it is master 1
#log-bin = /opt/mysql/binlogs/bin-log-mysqld1
#log-bin-index = /opt/mysql/binlogs/bin-log-mysqld1.index
#binlog-do-db = ## Leave this blank if you want to control it on slave

## This is exlusively for mysqld2
## It is on 3307 with data directory /opt/mysqld/data2
[mysqld2]
socket = /opt/mysql/run/mysqld.sock2
port = 3307
pid-file = /opt/mysql/run/mysqld.pid2
datadir = /opt/mysql/data2
lc-messages-dir = /opt/mysql/share/english

## Disable DNS lookups
#skip-name-resolve

## These support master - slave replication
log-bin = /opt/mysql/binlogs/bin-log-mysqld2
log-bin-index = /opt/mysql/binlogs/bin-log-mysqld2.index
#binlog-do-db =  ## Leave this blank if you want to control it on slave

## Relay log settings
#relay-log = /opt/mysql/log/relay-log-mysqld2
#relay-log-index = /opt/mysql/log/relay-log-mysqld2.index
#relay-log-space-limit = 4G

## Slow query log settings
#log-slow-queries = /opt/mysql/log/slow-log-mysqld2
#long_query_time = 2
#log-queries-not-using-indexes

## The rest of the my.cnf is shared
## Here follows entries for some specific programs
## The MySQL server
[mysqld]
basedir = /opt/mysql
tmpdir = /opt/mysql/tmp
socket = /opt/mysql/run/mysqld.sock
port = 3306
pid-file = /opt/mysql/run/mysqld.pid
datadir = /opt/mysql/data
lc-messages-dir = /opt/mysql/share/english

skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 64M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K

## Increase the max connections
max_connections = 1024

## Increase the max connect errors
max_connect_errors = 10000

## Increase the connect timeout
connect_timeout = 10

## Decrease the timeout and increase the retrieves of replication
slave-net-timeout = 60
master-connect-retry = 10

## The expiration time for logs, including binlogs
expire_logs_days = 14

## Set the character as utf8
character-set-server = utf8
collation-server = utf8_unicode_ci

## This is usually only needed when setting up chained replication
#log-slave-updates

## Enable this to make replication more resilient against server crashes and restarts
## but can cause higher I/O on the server
#sync_binlog = 1

## The server id, should be unique in same network
server-id = 1

## Set this to force MySQL to use a particular engine/table-type for new tables
## This setting can still be overridden by specifying the engine explicitly
## in the CREATE TABLE statement
default-storage-engine = INNODB

## Enable Per Table Data for InnoDB to shrink ibdata1
innodb_file_per_table = 1

## Set the max size of each binlog file
max_binlog_size = 1024M

## Set the binlog format
binlog_format = ROW

## Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /opt/mysql/data
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /opt/mysql/data
## You can set .._buffer_pool_size up to 50 - 80 % of RAM
## but beware of setting memory usage too high
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M
## Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 64M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M

[mysqlhotcopy]
interactive-timeout

[mysql.server]
user = mysql

[mysqld_safe]
log-error = /opt/mysql/log/mysqld.log
pid-file = /opt/mysql/run/mysqld.pid
open-files-limit = 8192

[client]
default-character-set = utf8

阅读全文 »

,

3 Comments

关于Oracle专用模式与共享模式的请教

今天无意之中翻到一个Word文档,打开一看居然是我在2010年1月14日,也就是一年多以前和一阵风大哥的聊天记录,是关于向他请教Oracle专用模式与共享模式的区别的,当时正好在做项目的过程中遇到了这个问题,虽然也查找过一些资料,但心里其实还是没底,而经过一阵风大哥的经验分享之后,就放心的把Oracle设置为了专用模式。
在这里,我把当时的聊天记录帖给大家,以供大家参考。

Rainbow  15:03:58
一阵风大哥。
请教你个问题。

一阵风  15:05:08
呵呵 什么问题 彩虹男

Rainbow  15:05:35
一般你Oracle用dbca建库时,是指定的共享模式还是专用模式呢?

一阵风  15:05:51
一般都是专用模式的
也是默认模式

Rainbow  15:06:07
但公司里有个前辈,他说共享模式好。
让我以后都建成共享模式。

一阵风  15:06:25
那看多少并发  还有业务方面了

Rainbow  15:06:30
我不知道它们到底有什么区别。
一般怎么来判断它们哪一种更适合业务?

一阵风  15:07:22
专用模式会为每个连接创建专有的服务进程,会分配专有的PGA 
如果你的pga比较大  专用模式比较有优的
如果并发比较大 短连接的话 共享模式好一点

Rainbow  15:09:15
好一点的话,主要是好在哪里?
速度,还是主机的资源耗用?

一阵风  15:12:21
比如 并发比较高  用专用模式比较耗资源  你可以g一下 网上有这方面说明
在dedicated server里,当你有大量的用户连接(比如,同一时间超过5000个用户连上来),你的系统负担就会相当大。而这种情况shared servers就可以处理的相对好一些,因为加入同时有5000个用户连上来而且我们知道一般只有1%的连接是active,那我们只需要设置50个 shared servers就可以把所有的用户请求处理得很好,并节省了系统资源。

Rainbow  15:16:11
知道啦,谢谢咯

一阵风  15:16:11
共享连接只是把连接SESSION信息放在LARGE POOL,所以LARGE POOL要大一些。而专用连接的SESION信息放在PGA。
不客气

Rainbow  15:16:52
那我用的10g,参数那里还用默认的百分比行不行啊?

一阵风  15:17:41
默认就行 你把SGA设置系统自动分配就行

Rainbow  15:18:02
还有就是我们有一些中间件软件,比如用Tomcat,weblogic这些之后。

一阵风  15:18:07
只设置一个sga最大值就行

Rainbow  15:18:16
是不是用共享模式就不如专用模式?

一阵风  15:18:52
我这边全是专用模式  也是tomcat  目前主要并发不是很大

Rainbow  15:19:34
按你那边的经验,如果并发达到300左右。8G内存的Server性能上如何?

一阵风  15:20:54
就用专用模式  然后把PGA设置大一点比如:5G

Rainbow  15:21:35
太感谢啦。

一阵风  15:21:43
不客气  多多交流

下面是一些总结性的言论:
—————————————————————
共享模式适用了一种类似连接池的概念,但实际应用中效果不是很好,不知道在10g中有没有改善。
—————————————————————
专用模式和共享模式的本质区别就是: 用户进程对ORACLE内存区里”服务器进程”的专用还是共享。
具体表现在:
1、在共享模式下,多个用户进程共享一个服务器进程,在专用模式下,ORACLE为每一个用户进程准备一个服务器进程。
2、在实际情况中,应用系统与数据库的连接请求总是很多,导致用户进程也很多,如果你的内存和CPU是有限的,同时,用户进程对数据库的操作占用空间不多,那你就把数据库连接模式设置为共享模式,这样,ORACLE内存区的服务器进程只是有限的几个,这几个服务器进程会通过一个调度程序来应付若干用户进程的请求。
3、如果你的硬件资源比较好,就设置成专用模式,每一个用户进程都有一个服务器进程对应,这样,你的用户进程对数据的处理会非常快!
—————————————————————
简单的说,连接数少,需要长时间占用数据库的,建议用专有模式,如果连接数众多而系统资源有限,使用共享模式。
—————————————————————

No Comments

推荐一篇针对MySQL数据库缓存参数优化的文章

简朝阳以前是阿里巴巴的DBA,在MySQL方面非常厉害,著有《MySQL性能调优与架构设计》一书,这本书我也买了。
针对MySQL数据库性能优化中的缓存参数优化,我在博客上向他提出了能否提供一些具体的建议取值范围后,他根据自己多年的经验在文章中进行了详细的补充,非常值得我们参考。

文章链接:http://isky000.com/database/mysql-perfornamce-tuning-cache-parameter

下面是相关内容:

上面这几个参数是 MySQL 中为了减少磁盘物理IO而设计的主要参数,对 MySQL 的性能起到了至关重要的作用。
—EOF—
按照 mcsrainbow 朋友的要求,这里列一下根据以往经验得到的相关参数的建议值:
query_cache_type : 如果全部使用innodb存储引擎,建议为0,如果使用MyISAM 存储引擎,建议为2,同时在SQL语句中显式控制是否使用query cache;
query_cache_size: 根据 命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))进行调整,一般不建议太大,256MB可能已经差不多了,大型的配置型静态数据可适当调大;
binlog_cache_size: 一般环境2MB~4MB是一个合适的选择,事务较大且写入频繁的数据库环境可以适当调大,但不建议超过32MB;
key_buffer_size: 如果不使用MyISAM存储引擎,16MB足以,用来缓存一些系统表信息等。如果使用 MyISAM存储引擎,在内存允许的情况下,尽可能将所有索引放入内存,简单来说就是“越大越好”;
bulk_insert_buffer_size: 如果经常性的需要使用批量插入的特殊语句(上面有说明)来插入数据,可以适当调大该参数至16MB~32MB,不建议继续增大,默认8MB;
innodb_buffer_pool_size: 如果不使用InnoDB存储引擎,可以不用调整这个参数,如果需要使用,在内存允许的情况下,尽可能将所有的InnoDB数据文件存放如内存中,同样将但来说也是“越大越好”;
innodb_additional_mem_pool_size: 一般的数据库建议调整到8MB~16MB,如果表特别多,可以调整到32MB,可以根据error log中的信息判断是否需要增大;
innodb_log_buffer_size: 默认是1MB,系的如频繁的系统可适当增大至4MB~8MB。当然如上面介绍所说,这个参数实际上还和另外的flush参数相关。一般来说不建议超过32MB;
innodb_max_dirty_pages_pct: 根据以往的经验,重启恢复的数据如果要超过1GB的话,启动速度会比较慢,几乎难以接受,所以建议不大于 1GB/innodb_buffer_pool_size(GB)*100 这个值。当然,如果你能够忍受启动时间比较长,而且希望尽量减少内存至磁盘的flush,可以将这个值调整到90,但不建议超过90;

1 Comment

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践

Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。

因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。

如下图所示:

下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考。

一、MySQL的安装与配置
具体的安装过程,建议参考我的这一篇文章:http://heylinux.com/archives/993.html
值得一提的是,我的安装过程都是源码包编译安装的,并且所有的配置与数据等都统一规划到了/opt/mysql目录中,因此在一台服务器上安装完成以后,可以将整个mysql目录打包,然后传到其它服务器上解包,便可立即使用。

二、MySQL主从复制
场景描述:
主数据库服务器:192.168.10.130,MySQL已经安装,并且无应用数据。
从数据库服务器:192.168.10.131,MySQL已经安装,并且无应用数据。

2.1 主服务器上进行的操作
启动mysql服务
/opt/mysql/init.d/mysql start

通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p’new-password’

授权给从数据库服务器192.168.10.131
mysql> GRANT REPLICATION SLAVE ON *.* to ‘rep1’@’192.168.10.131’ identified by ‘password’;

查询主数据库状态
Mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000005 | 261 | | |
+——————+———-+————–+——————+

记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到。

2.2 配置从服务器
修改从服务器的配置文件/opt/mysql/etc/my.cnf
将 server-id = 1修改为 server-id = 10,并确保这个ID没有被别的MySQL服务所使用。
阅读全文 »

27 Comments

源码编译安装 MySQL 5.5.x 实践

1.安装cmake
MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具。
因此,我们首先要在系统中源码编译安装cmake工具。

# wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz

# tar zxvf cmake-2.8.4.tar.gz

# cd cmake-2.8.4

# ./configure
# make
# make install

2.确保以下所需系统软件包已经被安装
通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。
gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libgcrypt* libtool*

如果缺少相关的软件包,可通过yum -y install 的方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh 的方式安装。

3. 安装前的系统设置
建立mysql安装目录及数据存放目录
# mkdir /opt/mysql
# mkdir /opt/mysql/data

创建用户和用户组
# groupadd mysql
# useradd -g mysql mysql

赋予数据存放目录权限
# chown mysql:mysql -R /opt/mysql/data

4.从configure更换为cmake
我相信大多数人都已经习惯了之前的configure方式,并且所使用的参数也是比较个性化的,换成cmake之后,这一方面会带来不少的麻烦。
还好,MySQL的官方网站提供了二者的参数对照表,我们可以尽可能的保留之前的参数,来编译配置新的MySQL版本。

configure 与 cmake 参数对照指南:
http://forge.mysql.com/wiki/Autotools_to_CMake_Transition_Guide

以我自己为例,之前我一直使用的参数为:
./configure –prefix=/opt/mysql/ \
–sysconfdir=/opt/mysql/etc \
–localstatedir=/opt/mysql/data \
–with-tcp-port=3306 \
–with-unix-socket-path=/tmp/mysqld.sock \
–with-mysqld-user=mysql \
–enable-assembler \
–with-extra-charsets=all \
–enable-thread-safe-client \
–with-big-tables \
–with-readline \
–with-ssl \
–with-embedded-server \
–enable-local-infile \
–with-plugins=partition,innobase,myisammrg

经过与cmake的参数对照之后,去除掉已经被取消的参数(大多数是因为新版本已经默认启用),cmake的参数配置如下:
cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql \
-DSYSCONFDIR=/opt/mysql/etc \
-DMYSQL_DATADIR=/opt/mysql/data \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
-DMYSQL_USER=mysql \
-DEXTRA_CHARSETS=all \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1
阅读全文 »

9 Comments

Oracle10g/11g 在SUSE/RHEL上的安装与配置[原创总结]

在过去对众多项目的支撑过程中,Oracle作为首选数据库,其安装与配置过程成了重复性最多的工作之一。
在此,我进行了总结,并分享出来,希望能对大家有所帮助。
随着Oracle版本的提升,从9i ->10g ->11g,其安装与配置过程其实越来越简单,尤其到了11g,会自动检测所缺少的系统软件包,并在系统参数配置方面进行自动调优。

在Linux下Oracle的安装配置过程我认为可分为三大步:
第一步 预安装的环境参数配置
在Windows下没有这一步,因为已经由安装程序直接完成了,Linux下目前也有相应的rpm软件包可进行快速设置,例如SUSE的orarun,但我强烈建议不要采用这类软件包,因为它们所完成的设置在参数、权限、目录规划等方面都存在不足。

第二步 实际的数据库安装过程
执行runInstaller安装数据库程序;
执行dbca创建数据库实例;
执行netca创建数据库监听和配置本地服务名;
这些过程与Windows平台上基本上没有什么差异。

第三步 系统服务的创建与配置
创建管理数据库服务的shell脚本,实现数据库的开机自启动和关机自停止。
这一步过程在Windows平台上可直接通过 管理工具-服务 进行配置。

鉴于Oracle10g与11g的安装与配置步骤基本相同,我就把它们整合在了一起,具体步骤如下:
一、预安装的环境参数配置
阅读全文 »

No Comments

Oracle9i与10g SGA及PGA参数调优设置

关于Oracle的参数调优的文章很多,但是对于初学者来说要弄明白还是不容易的,下面是前辈提供的调优参数,让我们这些菜鸟们可以直接拿来用。

1.Oracle 10g上的调优参数:将PGA_aggreate_target 设一下,其它让它自己分配,一般就是内存的40%-60%之间。

2.Oracle9i上的调优参数:物理内存是4G Oracle优化,共享池200M(10% * 1024M*4),高速缓存1638M (40% * 1024M*4),大型池16M,java池128M,PGA 256M。SGA最大2500M (注:32位操作系统只能支持到1.7G)

3.Oracle9i上的调优参数:物理内存是8G oracle优化,共享池512M,高速缓存4G,大型池16M,JAVA池256M,PGA512M。SGA最大2500M (注:32位操作系统只能支持到1.7G)

另外,提供一个思路,通过配合压力测试,使用spotlight on Oracle工具来调整参数,一直调到全部为稳定运行为绿色,不出现红色告警,一个小时内黄色告警不超过2-3次,基本上就很不错了。

还有要明确的是,平台和硬件的调优是必要的,但绝非最关键的,最关键的是数据库的软件调优,数据库的设计,一个好的数据库设计能够极大的改善数据库的性能。

No Comments

一次 ORA-03113: end-of-file on communication channel 错误定位过程

手动关闭Oracle之后打算再次启动Oracle:
$sqlplus ‘/as sysdba’
SQL> startup

ORA-03113: end-of-file on communication channel
结果便出现了以上错误。

通过上网查询出错原因,常见的原因有以下几个:
1、Unix核心参数设置不当
2、Oracle执行文件权限不正确/环境变量问题
3、客户端通信不能正确处理
4、数据库服务器崩溃/操作系统崩溃/进程被kill
5、Oracle 内部错误
6、特定SQL、PL/SQL引起的错误
7、空间不够
8、防火墙的问题

因为oracle已经正常运行了一个月,因此unix参数不对、权限环境变量、防火墙这些在首次启动就会发现的问题不应该现在才出现;而对于客户端通信、特定的SQL引起的错误,因为在启动过程中就已经报错,所以也排除。

由此判断,数据库服务崩溃/系统崩溃/进程被kill、Oracle内部错误、空间不够可能是原凶。

首先从最容易查起的原因开始,查询磁盘空间,结果磁盘空间利用不到30%,剩余空间足够;

于是检查Oracle内部错误:
$cd $ORACLE_HOME/admin/SID/cdump

发现大量的core,看来原因找到了。但所有的core目录都是空的,没有任何文件。

使用ulimit –a查看,原因core的文件大小为0,这是什么原因导致的core呢?

现在原因不明,于是检查bdump目录下的日志。
$cd $ORACLE_HOME/admin/SID/bdump
$cat alert_SID.log

发现日志量很大,满屏的都是同一个错误,扩展表空间失败:
ORA-1654: unable to extend index SID.INDEX by 128 in tablespace TABLESPACE
ORA-1653: unable to extend table SID.TABLE by 1024 in tablespace TABLESPACE

看来表空间已经满了并且无法扩展导致oracle出现core的。
$cd $ORACLE_BASE/oradada/SID
$ls –lh
-rw-r—– 1 oracle oinstall 2.1G Oct 14 15:10 SID_DATA01.DBF
-rw-r—– 1 oracle oinstall 201M Oct 14 12:28 SID_INDEX01.DBF

原来是空间已经达到2G,但应该触发扩展才对。
安装数据库时并没有限制SID_DATA01.DBF文件大小。

查看创建表空间的脚本,发现在脚本中对该文件有限制。脚本如下:
CREATE TABLESPACE SID_DATA DATAFILE
‘/data/oracle/oradata/SID/SID_DATA01.DBF’ SIZE 200M AUTOEXTEND ON NEXT 200M MAXSIZE 2048M’
MAXSIZE UNLIMITED
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL;

原来是在创建表空间时人为限制了表空间大小最大为2G,这是优化导致的问题,今后在新建数据库时都要记住,数据库要根据用户的使用场景来变更表空间。

很多程序只支持2G大小的文件,所以才定为2G,以避免此类问题,虽然使用的是ext3的文件系统,为了方便解决问题才定为2G。但数据库文件为2.1G,难道是文件太大导致的不能启动?

似乎问题找到了,只需要修改表空间即可解决问题。

但要修改表空间,首先要启动数据库,才能够修改表空间的参数,问题又绕回来了,数据库启不动。

于是再次在网上搜索资料,表空间满导致数据库启动不了的,还没有人遇见这样的问题,看来我们碰到的问题并不是前面所列出的八种原因,而是一种特殊原因。

尝试过多种启动方式:
Startup 直接启动
Startup mount 加载数据库
Startup unmount 不加载数据库
Startup force 强行启动

全是报同一个错误提示:ORA-03113: end-of-file on communication channel

经过几个小时,总结了一下,表空间满应用程序不停向数据库写数据,oracle出现异常,之后无法启动。但要解决数据库空间问题必须先启动。

于是在网上查询是否有办法在不启动数据库的情况下修改表空间,但找了很久没有此类方法。

难道真的要用删除数据库的方法才能够解决?

细心的人可能发现了我们问题解决过程,startup mount 和startup unmount执行结果都是相同的。或许是启动过程中碰到了什么问题导致无法启动,难道和数据库的文件大小根本没关系?是不是oracle启动时还需要其它文件,而这些文件也增大了?

于是使用find命令查询大于2G文件
$cd $ORACLE_BASE
$find . -size +2097160192c
./product/9.2.0.4/admin/SID/bdump/alert_SID.log
./oradata/SID/SID_DATA01.DBF

真的还有一个,清空该日志文件,启动….成功,再次修改oracle的表空间属性,日志中错误消失。

总结
1、经查询资料,了解到Oracle对自身日志文件有一个限制就是每个日志文件不能大于2G,大于2G以后会出现各种问题。且同样对日志文件有这样限制的软件还有不少,如Squid,RoseHA等。因此以后我们在今后要实际生产环境中部署的时候,一定要针对这一特点手工对Oracle做自动日志切割和清理。

2、千万不要删除oracle的数据库文件,即使备份后恢复数据也会丢掉,因为Oracle的数据文件是与磁盘物理位置有关联的,不像mysql那样。

No Comments

在RedHat Enterprise Linux 上Oracle 9i的安装配置与调优[原创全面规范]

本文带有图片的完整文档下载地址:http://heyLinux.com/download/Oracle9i.zip

 

1 安装配置Oracle 9i数据库

本章描述内容如下所示:
1.1 安装前的准备工作
介绍在安装Oracle之前所需的准备工作。
1.2安装前的系统设置
介绍在安装Oracle之前所必须的系统设置。
1.3 安装所需软件补丁包
介绍在基于RedHat Enterprise Linux AS4操作系统上安装Oracle之前所需软件补丁包的安装。
1.4 安装所需软件补丁包
介绍在基于RedHat Enterprise Linux 5操作系统上安装Oracle之前所需软件补丁包的安装。
1.5 安装配置Oracle数据库
介绍如何安装设置Oracle数据库软件。
1.6 编辑配置Oracle启动脚本
介绍如何创建并配置Oracle自定义脚本。

 

1.1 安装前的准备工作
1.1.1 获取数据库安装包
确保已取得9.2.0.4版本的Oracle数据库安装文件;
-ship_9204_linux_disk1.cpio.gz
-ship_9204_linux_disk2.cpio.gz
-ship_9204_linux_disk3.cpio.gz

确保已取得安装所需的软件补丁包;
-oracle9i_rhel_sp.zip

1.1.2 检查操作系统版本
执行命令# cat /etc/redhat-release,检查操作系统版本信息。

屏幕显示信息为
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
表示已是符合要求的RHEL 5.0以上版本。

Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
表示已是符合要求的RHEL AS4.0以上版本。

 

1.2 安装前的系统设置
1.2.1 创建用户和组
添加安装过程中需要用到的用户和组;
$ su – root  //直接使用root登录或切换到root身份
# groupadd oinstall  //添加用户组oinstall
# groupadd dba  //添加用户组dba
# useradd –g oinstall –G dba oracle  //添加用户oracle
# passwd oracle  //为oracle用户设置密码

1.2.2 创建安装目录
# mkdir –p /data/install
# cp ship_9204_linux_disk1.cpio.gz /data/install
# cp ship_9204_linux_disk2.cpio.gz /data/install
# cp ship_9204_linux_disk3.cpio.gz /data/install
# cp oracle9i_rhel_sp.zip /data/install

//将所有的安装包以及补丁包拷贝到该install文件夹里

# chown –R oracle.oinstall /data  //将目录权限属主更改为oracle用户

1.2.3 进行系统设置
a)设置内核参数
编辑/etc/sysctl.conf
kernel.shmmax = 2147483648  //这里设置为物理内存的一半,但32位RedHat最大仅支持4*1024*1024*1024 – 1 = 4294967295个字节
kernel.shmmni = 4096
kernel.shmall = 8388608
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

执行sysctl以反应修改,使内核参数立刻生效
# sysctl –p

b)设置Oracle对文件的要求
编辑/etc/security/limits.conf 添加以下内容到文档尾部
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384

c)设置Oracle环境变量
编辑/home/oracle/.bash_profile 添加以下内容到文档尾部
export ORACLE_SID=SFENET   //根据需要填写
export ORACLE_BASE=/data/oracle
export ORACLE_HOME=/data/oracle/product/9.2.0.4
export LD_LIBRARY_PATH=/data/oracle/product/9.2.0.4/lib:/lib:/usr/lib:/usr/local/lib:/usr/X11R6/lib
export TNS_ADMIN=/data/oracle/product/9.2.0.4/network/admin
export ORA_NLS33=/data/oracle/product/9.2.0.4/ocommon/nls/admin/data
export ORACLE_OWNER=oracle
export ORACLE_TERM=xterm
export PATH=/data/oracle/product/9.2.0.4/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

1.3 安装所需软件补丁包(基于RedHat Linux AS 4)
a)解压准备好的补丁压缩包
# cd /data/install
# unzip oracle9i_rhel_sp.zip
# cd /data/install/oracle9i_rhel_sp/

b)打p3006854_9204_LINUX.zip
# unzip p3006854_9204_LINUX.zip
# chmod +x 3006854/rhel3_pre_install.sh
# 3006854/rhel3_pre_install.sh

c)安装其它软件补丁包
# rpm -ivh compat-db-4.1.25-9.i386.rpm
# rpm -ivh compat-gcc-32-3.2.3-47.3.i386.rpm
# rpm -ivh compat-gcc-32-c++-3.2.3-47.3.i386.rpm
# rpm -ivh libaio-devel-0.3.105-2.i386.rpm
# rpm -ivh libaio-0.3.105-2.i386.rpm
# rpm -ivh compat-oracle-rhel4-1.0-5.i386.rpm
# rpm -ivh compat-libcwait-2.1-1.i386.rpm
# rpm -ivh compat-libgcc-296-2.96-132.7.2.i386.rpm
# rpm -ivh compat-libstdc++-296-2.96-132.7.2.i386.rpm
# rpm -ivh compat-libstdc++-33-3.2.3-47.3.i386.rpm
# rpm -ivh openmotif21-2.1.30-11.RHEL4.6.i386.rpm
# rpm -ivh giflib-4.1.3-8.i386.rpm
# rpm -ivh glib-1.2.10-26.fc7.i386.rpm
# rpm -ivh libpng10-1.0.18-2.i386.rpm
# rpm -ivh ORBit-0.5.17-22.rhel5.i386.rpm
# rpm -ivh gtk+-1.2.10-57.fc7.i386.rpm
# rpm -ivh imlib-1.9.15-2.fc7.i386.rpm
# rpm -ivh gnome-libs-1.4.1.2.90-44.1.i386.rpm
# rpm -ivh gnome-libs-devel-1.4.1.2.90-44.1.i386.rpm
# rpm -ivh xorg-x11-deprecated-libs-devel-6.8.2-1.EL.13.36.i386.rpm
# rpm -ivh xorg-x11-deprecated-libs-6.8.2-1.EL.13.36.i386.rpm

1.4 安装所需软件补丁包(基于RedHat Enterprise Linux 5)
a)解压准备好的补丁压缩包
# cd /data/install
# unzip oracle9i_rhel_sp.zip
# cd /data/install/oracle9i_rhel_sp/

b)打p3006854_9204_LINUX.zip
# unzip p3006854_9204_LINUX.zip
# chmod +x 3006854/rhel3_pre_install.sh
# 3006854/rhel3_pre_install.sh

c)安装其它软件补丁包
# rpm -ivh compat-libcwait-2.1-1.i386.rpm
# rpm -ivh compat-db-4.2.52-5.1.i386.rpm
# rpm -ivh libXp-1.0.0-8.i386.rpm
# rpm -ivh libXp-devel-1.0.0-8.i386.rpm
# rpm -ivh openmotif-2.3.0-0.3.el5.i386.rpm
# rpm -ivh openmotif-devel-2.3.0-0.3.el5.i386.rpm
# rpm -ivh giflib-4.1.3-8.i386.rpm
# rpm -ivh glib-1.2.10-26.fc7.i386.rpm
# rpm -ivh libpng10-1.0.18-2.i386.rpm
# rpm -ivh ORBit-0.5.17-22.rhel5.i386.rpm
# rpm -ivh gtk+-1.2.10-57.fc7.i386.rpm
# rpm -ivh imlib-1.9.15-2.fc7.i386.rpm
# rpm -ivh gnome-libs-1.4.2-7.rhel5.i386.rpm

d)创建软链接
# ln -s /usr/lib/libstdc++-libc6.2-2.so.3 /usr/lib/libstdc++-libc6.1-1.so.2

1.5 安装配置Oracle数据库
a)重新登录操作系统
注销当前用户后通过oracle用户登录到图形界面

b)解压Oracle安装文件
$ cd /data/install
$ zcat ship_9204_linux_disk1.cpio.gz | cpio -idmv
$ zcat ship_9204_linux_disk2.cpio.gz | cpio -idmv
$ zcat ship_9204_linux_disk3.cpio.gz | cpio -idmv

c)安装Oracle9i数据库服务器
$ export LANG=en_US.UTF-8  //更改系统语言为English
$ Disk1/runInstaller  //启动安装程序

弹出Oracle安装向导界面,如下图所示。
选择“Next”。

出现如下图所示对话框,保持默认不变,继续下一步“OK”。

弹出“UNIX Group Name”窗口,如下图所示。

设置数据库组名。
在“UNIX Group Name”文本框中填写数据库组名“oinstall”。
在“UNIX Group Name”窗口单击“Next”。
安装程序将弹出“Oracle Universal Installer”对话框,要求以root用户执行/tmp/orainstRoot.sh脚本,如下图所示。

新建一个终端窗口,切换到root用户身份并执行脚本
$ su – root
# /tmp/orainstRoot.sh

屏幕显示类似如下信息即表示执行成功
Creating Oracle Inventory pointer file (/etc/oraInst.loc)
Changing groupname of /data/oracle/oraInventory to oinstall.

脚本执行完毕后,返回到当前图形安装界面
在“Oracle Universal Installer”对话框中单击“Continue”。

安装程序进入“File Locations”窗口,设置“File Locations”,如下图所示。

在“File Locations”窗口单击“Next”

安装程序进入“Available Products”窗口,如下图所示。

在“Select a product to install”下的产品类型选项中选择“Oracle9i Database 9.2.0.4.0”单选框。

在“Available Products”窗口单击“Next”。安装程序进入“Installation Types”窗口,如下图所示。

选择“Enterprise Edition”企业版安装类型。
在“Installation Types”窗口单击“Next”。

安装程序进入“Database Configuration”窗口,如下图所示。

在“Select a database suited to your needs.”下的数据库配置方式选项中选择“Software Only”单选框,只安装软件,实例创建到后面有描述。
在“Database Configuration”窗口单击“Next”。

安装程序进入“Summary”窗口,如下图所示。

确认安装选项后单击“Install”。

安装程序进入“Install”窗口,如下图所示。

弹出“Setup Privileges”提示框,

要求执行root.sh脚本,如下图所示。

在等待安装的过程中,系统会弹出“Setup Privileges”提示框,要求以root用户执行/data/oracle/product/ 9.2.0.4/root.sh脚本。请根据以下步骤继续安装。

新建一个终端窗口,切换到root用户身份并执行脚本
$ su – root
# /data/oracle/product/ 9.2.0.4/root.sh
脚本执行过程中,对系统提示需配置的配置项,请保持默认配置,直接按“Enter”键即可。
如出现“Now product-specific root actions will be performed.”字样表示执行成功。
脚本执行完毕后,返回到当前图形安装界面。

在“Setup Privileges”提示框单击“OK”。

请等待安装至100%。

安装至100%后安装程序进入“End of Installation”窗口,单击“Exit”。

d)解决安装Configuration Tools中的错误
解决Agent Configuration Assistant启动失败的问题
$cd /data/oracle/install/oracle9i_rhel_sp/
$ unzip p3238244_9204_LINUX.zip
$ cp 3238244/files/lib/stubs/* $ORACLE_HOME/lib/stubs/
$ cd $ORACLE_HOME/network/lib/
$ make -f ins_oemagent.mk install

解决Oracle Net Configuration Assistant, Oracle Database Configuration Assistant启动失败的问题
$ rm $ORACLE_HOME/JRE
$ ln -s $ORACLE_BASE/jre/1.3.1/ $ORACLE_HOME/JRE
$ ln -s $ORACLE_HOME/JRE/bin/java $ORACLE_HOME/JRE/bin/jre
$ ln -s $ORACLE_HOME/JRE/bin/i386/native_threads/java $ORACLE_HOME/JRE/bin/i386/native_threads/jre

解决Net Manager启动失败的问题
$cd $ORACLE_HOME/bin/
$vi netmgr

进行下面的修改
# Run Net Manager
$JRE -classpath $CLASSPATH oracle.net.mgr.container.NetApplication oracle.net.mgr.container.NetApplication
修改为:
# Run Net Manager
$JRE -noverify -classpath $CLASSPATH oracle.net.mgr.container.NetApplication oracle.net.mgr.container.NetApplication

e)执行dbca配置并创建数据库
在控制台执行命令dbca,显示安装准备界面如下图所示。
$ dbca

安装准备完毕后,显示安装欢迎窗口如下图所示。

单击“Next”,显示操作类型选择窗口如下图所示。

选择“Create a database”后,单击“Next”,显示数据库模式选择窗口如下图所示。

选择“New Database”后,单击“Next”,显示数据库信息设置窗口如下图所示。

设置“Global Database Name”和“SID”为“SFENET”,单击“Next”,显示“Database Features”窗口如下图所示。
Global Database Name:全局数据库名称。
SID:Oracle数据库实例名。

将“Database Features”页签中所选中的内容全部取消。
在取消各项内容时,弹出提示窗口示例如下图所示。

单击“Yes”,显示下图所示窗口。

单击“Standard database features…”,显示窗口如下图所示。

将“Standard database features”页签中所选中的内容全部取消。

在取消各项内容时,弹出提示窗口示例如下图所示。

单击“Yes”,显示下图所示窗口。

单击“OK”,再单击“Next”,显示下图所示窗口。

选择“Dedicated Server Mode”,单击“Next”,显示参数设置窗口如下图所示。

在“Memory”页签中设置“Shared Pool”为“400”,“Buffer Cache”为“1000”,“Java Pool”为“100”,“Large Pool”为“40”,“PGA”为“24”后,选择“Character Sets”页签如下图所示。

根据实际应用不同,考虑到中文支持良好的情况,选择“ZHS16GBK”为佳,若是多语言国际性应用系统则应选择“UTF8”。
在“Character Sets”页签中设置数据库字符集为“UTF8”,选择“DB Sizing”页签如下图所示。

保持“Block Size”和“Sort Area Size”参数为默认即可。然后选择“File Locations”页签如下图所示。

保持此页签所有选项为默认即可,然后选择“Archive”页签,设置以下参数,如下图所示。

在海量数据下做数据恢复的时候,开启了该归档模式会导致恢复时磁盘空间不足,从而导致数据恢复失败。
于是这里选择非归档模式,即不要选择“Archive Log Mode”复选框。

然后点击“Next”按钮,进入“Database Storage”窗口,如下图所示。

选择“Controlfile”,显示数据库控制文件信息如下图所示。

单击“Options”页签,如下图所示。

修改“Maximum no. of datafiles”参数为“500”,修改“Maximum no. of redo log files”参数为“40”,修改“Maximum no. of  log members”参数为“3”。

在“Storage”目录树中选择“Tablespaces”中的“INDX”目录,如下图所示。
“INDX”目录“General”页签

按照所示修改Tablespaces目录中INDX的文件名,路径和容量。
Storage-Tablespaces-INDX            File Name                                                  File Directory Size
indx01.dbf                                  {ORACLE_BASE}/oradata/{DB_NAME}/    100MB

Tablespaces分支文件属性的设置方法如下:
双击File Name、File Directory或Size的值域框,弹出“Edit Datafile”对话框。
进入“General”页签,在“Name”文本框中输入“File Directory/File name”,在File Size文本框中输入文件大小。
进入“Storage”页签,去掉“Automatically extend datafile when full(AUTOEXTEND)”复选框。
后面的Tablespaces分支文件都要按照上述方法进行操作。

按照所示修改Tablespaces目录中SYSTEM的文件名,路径和容量。
Storage-Tablespaces-SYSTEM     File Name                                                     File Directory Size
system01.dbf                             {ORACLE_BASE}/oradata/{DB_NAME}/       2000MB

按照所示修改Tablespaces目录中TEMP的文件名,路径和容量。
Storage-Tablespaces-TEMP         File Name                                                     File Directory Size
temp01.dbf                                {ORACLE_BASE}/oradata/{DB_NAME}/      2000MB
temp02.dbf                                {ORACLE_BASE}/oradata/{DB_NAME}/      2000MB

按照所示修改Tablespaces目录中TOOLS的文件名,路径和容量。
Storage-Tablespaces-TOOLS       File Name                                                      File Directory Size
tools01.dbf                                {ORACLE_BASE}/oradata/{DB_NAME}/       100MB

按照所示修改Tablespaces目录中UNDOTBS1的文件名,路径和容量。
Storage-Tablespaces- UNDOTBS1   File Name                                                      File Directory Size
undotbs01.dbf                               {ORACLE_BASE}/oradata/{DB_NAME}/       2000MB
undotbs02.dbf                               {ORACLE_BASE}/oradata/{DB_NAME}/       2000MB
undotbs03.dbf                               {ORACLE_BASE}/oradata/{DB_NAME}/       2000MB
undotbs04.dbf                               {ORACLE_BASE}/oradata/{DB_NAME}/       2000MB

按照所示修改Tablespaces目录中USERS的文件名,路径和容量。
Storage-Tablespaces- USERS          File Name                                                     File Directory Size
users01.dbf                                   {ORACLE_BASE}/oradata/{DB_NAME}/       40MB

在“Storage”目录树中选择“Redo Log Groups”中的“1”目录,按照所示修改大小。
Storage-Redo Log Groups- 1           File Name                                                      File Directory Size
redo01.log                                    {ORACLE_BASE}/oradata/{DB_NAME}/        1024MB

在“Storage”目录树中选择“Redo Log Groups”中的“2”目录,按照所示修改大小。
Storage-Redo Log Groups- 2           File Name                                                      File Directory Size
redo02.log                                    {ORACLE_BASE}/oradata/{DB_NAME}/        1024MB

在“Storage”目录树中选择“Redo Log Groups”中的“3”目录,按照所示修改大小。
Storage-Redo Log Groups-3          File Name                                                       File Directory Size
redo03.log                                   {ORACLE_BASE}/oradata/{DB_NAME}/        1024MB

单击“Next”,显示“Creation Options”窗口如下图所示。

单击“Finish”,显示“Summary”窗口如下图所示。

单击“OK”,显示数据配置脚本生成成功如下图所示。

单击“OK”,显示数据服务创建进度如下图所示。

在创建数据的过程中,会出现如下提示,单击“ignore”即可。

成功创建数据库实例后,设置sys和system用户的密码,如下图所示。

请牢记sys用户密码、system用户密码。

单击“Exit”,退出安装。

f)执行netca配置数据库监听服务
在控制台执行命令netca,显示监听配置界面如下图所示。
$ netca

单击“Next”,显示操作类型选择窗口如下图所示。

选择“Add”后,单击“Next”,显示监听名称配置窗口如下图所示。

单击“Next”,显示监听协议配置窗口如下图所示。

单击“Next”,显示监听端口配置窗口如下图所示。

单击“Next”,显示监听配置结束画面如下图所示。
选择“No”,单击“Next”,然后单击“Finished”退出。
在终端中出现“Listener Started successfully.”字样表示监听成功配置并启动。

g)安装Oracle9i数据库客户端
$ export LANG=en_US.UTF-8  //更改系统语言为English
$ Disk1/runInstaller  //启动安装程序
弹出Oracle安装向导界面,如下图所示。

选择“Next”。

安装程序进入“File Locations”窗口,设置“File Locations”,如下图所示。

在“File Locations”窗口单击“Next”
安装程序进入“Available Products”窗口,如下图所示。

在“Select a product to install”下的产品类型选项中选择“Oracle9i Client 9.2.0.4.0”单选框。
在“Available Products”窗口单击“Next”。

安装程序进入“Installation Types”窗口,如下图所示。

选择“Administrator”管理员安装类型。
在“Installation Types”窗口单击“Next”。

安装程序进入“Oracle Universal Installer”窗口,如下图所示。
确认安装选项后单击“Install”。

安装程序进入“Install”窗口,如下图所示

安装至100%后安装程序进入“End of Installation”窗口,如下图所示。

在“End of Installation”窗口单击“Exit”。

1.6 编写配置Oracle启动脚本
a)编辑 /etc/oratab文件

编辑 /etc/oratab文件,配置以下常用选项:
#*:/data/oracle/product/9.2.0.4:N  //注释掉该选项;
SFENET:/data/oracle/product/9.2.0.4:Y  //修改该选项最后的“N”为“Y”;

b)创建软链接
# ln -s /data/oracle/product/9.2.0.4/dbs/spfileSFENET.ora /data/oracle/product/9.2.0.4/dbs/initSFENET.ora

c)修改dbshut脚本

编辑 /data/oracle/product/9.2.0.4/bin/dbshut文件,修改以下内容:

修改第80行与第85行的 shutdown 为 shutdown immediate

d)编写自定义脚本
创建用于启动、关闭与重启Oracle服务的自定义脚本并命名为oracle9i,内容如下:

================================================================
# !/bin/sh
# chkconfig: 2345 80 03
# description: oracle dabase deamons
# filename:oracle9i

ORACLE_HOME=/data/oracle/product/9.2.0.4
ORACLE_OWNER=oracle

case “$1” in
‘start’)

ORACLE_PROCESS=`ps -e |grep oracle |wc -l`

if [ $ORACLE_PROCESS -ne 0 ];
then
echo “ERROR: Oracle already running.”
sleep 1
else
echo -n “Starting Oracle: ”
su – $ORACLE_OWNER -c $ORACLE_HOME/bin/dbstart
touch /var/lock/subsys/oracle9i
sleep 2
fi

ORACLE_LISTENER=`ps -e |grep tnslsnr |wc -l`

if [ $ORACLE_LISTENER -ne 0 ];
then
echo “ERROR: Listener already running.”
sleep 1
else
echo -n “Starting Listener: ”
su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/lsnrctl start”
sleep 2
fi

echo
;;

‘stop’)

ORACLE_LISTENER=`ps -e |grep tnslsnr |wc -l`

if [ $ORACLE_LISTENER -ne 0 ];
then
echo -n “Shutting down Listener: ”
su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/lsnrctl stop”
sleep 2
else
echo “ERROR: Listener already shutdown.”
sleep 1
fi

ORACLE_PROCESS=`ps -e |grep oracle |wc -l`

if [ $ORACLE_PROCESS -ne 0 ];
then
echo -n “Shutting down Oracle: ”
su – $ORACLE_OWNER -c $ORACLE_HOME/bin/dbshut
rm -f /var/lock/subsys/oracle9i
sleep 2
else

echo “ERROR: Oracle already shutdown.”
sleep 1
fi

echo
;;

‘restart’)

echo “Restarting Oracle: ”

$0 stop
$0 start

echo
;;

*)

echo “Usage: oracle { start | stop | restart }”
exit 1

esac

exit 0
================================================================

 

e)配置自定义脚本

通过以下命令将自定义脚本添加至系统自动启动与自动关闭管理服务中:
# cp oracle9i /etc/rc.d/init.d/
# chmod 744 /etc/rc.d/init.d/oracle9i
# chown oracle:oinstall /etc/rc.d/init.d/oracle9i
# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc3.d/S99oracle9i
# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc5.d/S99oracle9i
# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc0.d/K01oracle9i
# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc6.d/K01oracle9i

这样,系统在开启时将会最后自动启动Oracle,而在关闭时会最先自动关闭Oracle。

f)使用自定义脚本
/etc/init.d/oracle9i start  //启动数据库
/etc/init.d/oracle9i stop  //关闭数据库
/etc/init.d/oracle9i restart  //重启数据库

1 Comment