Oracle数据库篇
3.1 安装启动
3.1.1 Oracle的几种启动方式
有以下几种启动方式:
1、startupnomount
非安装启动,这种方式启动下可执行:
重建控制文件、重建数据库
读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。
2、startupmount dbname
安装启动,这种方式启动下可执行:
数据库日志归档、
数据库介质恢复、
使数据文件联机或脱机,
重新定位数据文件、重做日志文件。
执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置,
但此时不对数据文件和日志文件进行校验检查。
3、startupopen dbname
先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件,
这种方式下可访问数据库中的数据。
4、startup,等于以下三个命令
startup nomount
alterdatabase mount
alterdatabase open
5、startuprestrict
约束方式启动
这种方式能够启动数据库,但只允许具有一定特权的用户访问
非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用
6、startupforce
强制启动方式
当不能关闭数据库时,可以用startupforce来完成数据库的关闭
先关闭数据库,再执行正常启动数据库命令
7、startuppfile=参数文件名
带初始化参数文件的启动方式
先读取参数文件,再按参数文件中的设置启动数据库
例:startup pfile=E:Oracleadminoradbpfileinit.ora
8、startup EXCLUSIVE
3.1.2 Oracle的几种关闭方式
1、shutdown normal
正常方式关闭数据库。
2、shutdown immediate
立即方式关闭数据库。
在SVRMGRL中执行shutdown immediate,数据库并不立即关闭,而是在Oracle执行某些清除工作后才关闭(终止会话、释放会话资源),当使用shutdown不能关闭数据库时,shutdown immediate可以完成数据库关闭的操作。
3、shutdown abort
直接关闭数据库,正在访问数据库的会话会被突然终止,如果数据库中有大量操作正在执行,这时执行shutdownabort后,重新启动数据库需要很长时间停止
3.2 常用命令
3.2.1 启动监听
lsnrctl stop
lsnrctl start
查看监听是否启动
[oracle@oracle ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.1.0.6.0 - Productionon 15-FEB-2012 08:47:48
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNRfor Linux: Version 11.1.0.6.0 - Production
Start Date 01-FEB-2012 10:43:59
Uptime 13 days 22hr. 3 min. 51 sec
Trace Level off
Security ON: LocalOS Authentication
SNMP OFF
Listener Parameter File /dba/oracle/product/11.1/db_1/network/admin/listener.ora
Listener Log File /dba/oracle/diag/tnslsnr/oracle/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.21.10.45)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl", statusREADY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
Instance "orcl", statusREADY, has 1 handler(s) for this service...
Service "orcl_XPT" has 1 instance(s).
Instance "orcl", statusREADY, has 1 handler(s) for this service...
The command completed successfully
3.2.2 修改密码
Oracle用户登录
sql>alter user username identified by newpassword;
3.2.3 连接数据库
[root@oracle ~]# su - oracle
[oracle@oracle ~]$ sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on Wed Feb 15 09:35:42 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL>
3.2.4 SQL*PLUS使用
1)进入SQL*Plus
$sqlplus 用户名/密码
[oracle@oracle ~]$ sqlplus dhm/coship
SQL*Plus: Release 11.1.0.6.0 - Production on Wed Feb 15 10:14:21 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bitProduction
With the Partitioning, OLAP, Data Mining and Real Application Testingoptions
SQL>
2)退出SQL*Plus
SQL>exit
3)在sqlplus下得到帮助信息
列出全部SQL命令和SQL*Plus命令
SQL>help
列出某个特定的命令的信息
SQL>help 命令名
4)显示表结构命令DESCRIBE
SQL>DESC 表名
5)表的创建、修改、删除
创建表的命令格式如下:
create table 表名 (列说明列表);
为基表增加新列命令如下:
ALTER TABLE 表名 ADD (列说明列表)
例:为test表增加一列Age,用来存放年龄
sql>alter table test
add (Age number(3));
修改基表列定义命令如下:
ALTER TABLE 表名
MODIFY (列名 数据类型)
例:将test表中的Count列宽度加长为10个字符
sql>alter atble test
modify (County char(10));
将一张表删除语句的格式如下:
DORP TABLE 表名;
例:表删除将同时删除表的数据和表的定义
sql>drop table test
3.2.5 常用的SQL语法
1)INSERT (往数据表里插入记录的语句)
INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……);
INSERT INTO 表名(字段名1, 字段名2, ……) SELECT (字段名1, 字段名2, ……) FROM 另外的表名;
2)DELETE (删除数据表里记录的语句)
DELETE FROM 表名 WHERE 条件;
注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些被删除的数据块标成unused.
如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间
TRUNCATE TABLE 表名;
此操作不可回退.
3)UPDATE (修改数据表里记录的语句)
UPDATE表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件;
4)CREATE (创建表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等)
ORACLE常用的字段类型有
CHAR 固定长度的字符串
VARCHAR2 可变长度的字符串
NUMBER(M,N) 数字型M是位数总长度, N是小数的长度
DATE 日期类型
5)ALTER (改变表,索引, 视图等)
改变表的名称
ALTER TABLE 表名1 TO 表名2;
在表的后面增加一个字段
ALTER TABLE表名 ADD 字段名 字段名描述;
修改表里字段的定义描述
ALTER TABLE表名 MODIFY字段名 字段名描述;
给表里的字段加上约束条件
ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (字段名);
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (字段名);
把表放在或取出数据库的内存区
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;
6)DROP (删除表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等)
删除表和它所有的约束条件
DROP TABLE 表名 CASCADE CONSTRAINTS;
7)TRUNCATE (清空表里的所有记录,保留表的结构)
TRUNCATE 表名;
8)SELECT (查询)
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 条件;
字段名可以带入函数
例如: COUNT(*), MIN(字段名), MAX(字段名), AVG(字段名), DISTINCT(字段名),
TO_CHAR(DATE字段名,'YYYY-MM-DDHH24:MI:SS')
分组查询
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] GROUP BY字段名1
[HAVING 条件] ;
查询结果集的排序操作, 默认的排序是升序ASC, 降序是DESC
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……]
ORDER BY字段名1, 字段名2 DESC;
3.2.6 查看系统参数
select count(*) from v$process --当前的连接数
select value from v$parameter where name = 'processes' --数据库允许的最大连接数
alter system set processes = 300 scope = spfile;修改最大连接数:
select * from user_sys_privs; --查看当前用户的系统权限
select * from user_tab_privs;-- 查看当前用户的系统权限和表级权限
3.2.7 创建表空间
1、查询空闲空间
select tablespace_name,file_id,block_id,bytes,blocks from dba_free_space;
2、增加Oracle表空间
先查询数据文件名称、大小和路径的信息,语句如下:
select tablespace_name,file_id,bytes,file_name from dba_data_files;
3、修改文件大小
alter database datafile '/home/app/oracle/oradata/oracle8i/testing.dbf'resize 800M;
/home/app/oracle/oradata/oracle8i/test01.dbf是上面查询到的路径
4、创建Oracle表空间
create tablespace test
datafile '/home/app/oracle/oradata/oracle8i/test01.dbf' size 8M
autoextend on
next 5M
maxsize 10M;
create tablespace sales
datafile '/home/app/oracle/oradata/oracle8i/sales01.dbf' size 800M
autoextend on
next 50M
maxsize unlimited
maxsize unlimited 是大小不受限制
create tablespace sales
datafile '/home/app/oracle/oradata/oracle8i/sales01.dbf' size 800M
autoextend on
next 50M
maxsize 1000M
extent management local uniform;
unform表示区的大小相同,默认为1M
create tablespace sales
datafile '/home/app/oracle/oradata/oracle8i/sales01.dbf' size 800M
autoextend on
next 50M
maxsize 1000M
extent management local uniform size 500K;
unform size 500K表示区的大小相同,为500K
create tablespace sales
datafile '/home/app/oracle/oradata/oracle8i/sales01.dbf' size 800M
autoextend on
next 50M
maxsize 1000M
extent management local autoallocate;
autoallocate表示区的大小由随表的大小自动动态改变,大表使用大区小表使用小区
create tablespace sales
datafile '/home/app/oracle/oradata/oracle8i/sales01.dbf' size 800M
autoextend on
next 50M
maxsize 1000M
temporary;
temporary创建字典管理临时表空间
create temporary tablespace sales
tempfile '/home/app/oracle/oradata/oracle8i/sales01.dbf' size 800M
autoextend on
next 50M
maxsize 1000M
创建本地管理临时表空间,如果是临时表空间,所有语句中的datafile都换为tempfile
为表空间增加数据文件:
alter tablespace sales add
datafile '/home/app/oracle/oradata/oracle8i/sales02.dbf' size 800M
autoextend on next 50M
maxsize 1000M;
创建本地管理临时Oracle表空间,如果是临时表空间,所有语句中的datafile都换为tempfile8i系统默认创建字典管理临时表空间,要创建本地管理临时表空间要加temporary tablespace关键字创建本地管理临时表空间时,不得使用atuoallocate参数,系统默认创建uniform管理方式
为表空间增加数据文件:
alter tablespace sales add
datafile '/home/app/oracle/oradata/oracle8i/sales02.dbf' size 800M
autoextend on next 50M
maxsize 1000M;
5、更改自动扩展属性:
alter database datafile
'/home/app/oracle/oradata/oracle8i/sales01.dbf',
'/home/app/oracle/oradata/oracle8i/sales02.dbf'
'/home/app/oracle/oradata/oracle8i/sales01.dbf
autoextend off;
6、用户创建,授权
CREATE USER dhm IDENTIFIED BY dhm DEFAULT TABLESPACE dhm;
7、给用户分配权限
grant connect,resource to dhm;
分配了之后,什么表空间都可以
8、案例
建立aaa数据表空间
create tablespace aaa datafile'/home/oracle/app/oracle/oradata/orcl1/aaa.dbf' size 1024m autoextend on next512m maxsize unlimited logging extent management local segment space managementauto;
创建aaa临时表空间
create temporary tablespace aaa_temp tempfile'/home/oracle/app/oracle/oradata/orcl1/aaa_temp.dbf' size 512m;
创建aaa用户
create user aaa identified by coship default tablespace aaa temporarytablespace aaa_temp profile DEFAULT ACCOUNT UNLOCK;
赋予aaa用户权限
grant connect,resource,dba to aaa;
3.3 常见问题
3.3.1 ORA-00845
1、问题现象
ORACLE启动,提示如下:
SQL> startup ;
ORA-00845: MEMORY_TARGET not supported on this system
2、原因分析
在Oracle 11g里,通过MEMORY_TARGET参数自动管理SGA和PGA。 但是在Oracle 11gR2 里如果MEMORY_TARGET参数值设定的过大,可能就会出现这个错误。MEMORY_MAX_TARGET 的设置不能超过 /dev/shm 的大小
3、解决办法
解决方法:增加/dev/shm, /dev/shm通常用做共享内存。
/dev/shm是一个临时文件系统(tmpfs) 。 从/etc/fstab中mount支持标准的参数"size",简单解决:可以增加/dev/shm上的tmpfs大小.设置大于或者等内存一般就可以解决了。
如果想立即生效,方法如下:
# umount tmpfs
# mount -t tmpfs shmfs -o size=16G /dev/shm
让以后每次重启OS都自动mount,修改文件 /etc/fstab 将tmpfs 修改成以下值:
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
如果直接修改/etc/fstab,通过重启OS 也可以让参数生效。
注意:这个size 的大小需要设置为整数。
df -h 在查查修改后的/dev/shm的大小
设置完成之后,再启动ORACLE,正常启动!
3.3.2ORA-00600
1、问题现象
使用plsql连接数据库提示:
ORA-01033:ORACLE initialization or shutdown in progress
Process ID: 0
Session ID:0 Serial number:0
启动日志打印:
SQL*Plus: Release 11.1.0.6.0 - Production on Wed Feb 1 11:37:11 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL> Connected to an idle instance.
SQL> ORACLE instance started.
Total System Global Area 6747725824 bytes
Fixed Size 2145024bytes
Variable Size 4429186304bytes
Database Buffers 2281701376bytes
Redo Buffers 34693120bytes
Database mounted.
ORA-00600: internal error code, arguments: [kcratr1_lastbwr], [], [], [],[],[], [], []
2、原因分析
出现该错误是因为系统强制关机造成的
症状为数据库无法打开
3、解决办法
1>shutdown
2>startup mount
3>recover database
4>alter database open
3.3.3 ORA-12546
1、问题描述
使用sqlplus登录数据库异常:
[root@vsp oradata]# sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 -Production on Wed Oct 26 09:56:14 2011
Copyright (c) 1982, 2005,Oracle. All rights reserved.
SQL> conn /as sysdba
ERROR:
ORA-12546: TNS:permission denied
2、原因分析
用户权限不足
3、解决方案
给oracle用户赋权。命令如下:
1)赋权:
chmod -R 777 /var/tmp/.oracle
2)停止监听
lsnrctl stop
3)重启启动oracle监听程序。
[oracle@vsp ~]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 26-OCT-2011 10:47:24
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is/u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to/u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.20.14.11)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNRfor Linux: Version 10.2.0.1.0 - Production
Start Date 26-OCT-2011 10:47:24
Uptime 0 days 0hr. 0 min. 0 sec
Trace Level off
Security ON: LocalOS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.20.14.11)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc",status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@vsp ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Oct 26 10:47:39 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn /as sysdba
Connected.
SQL>
3.3.4ORA-28000
1、问题现象
oracle用户(Normal)用PLSQL Developer登陆时,提示:ORA-28000:the account is locked
2、原因分析
用户被锁定
3、解决方案
1)使用PL/SQL登陆,登陆名改为system,数据库名不变,选择类型normal改为sysdba;
2)选择myjob,查看users;
3)选择system右击点击编辑
4)修改密码,把“帐户被锁住”的勾去掉
5)点击应用,再重新登陆
第二种方法
1)使用PL/SQL登陆,登陆名改为system,数据库名不变,选择类型normal改为sysd
2)在命令行执行:alter user username account unlock;
3.3.5 如何恢复oracle数据库数据
作者:胡文华
日期: 2011-10-20
部门:视讯前端产品线/测试部/项目测试部
产品名称:OC_V100R001C001B044
案例简述:ORACLE数据库被执行初始化操作,导致各数据表为空。
关键字:ORACLE,数据表,恢复
一. 问题描述:
互动点播系统页面无栏目、无节目显示,BMS管理系统登录密码被初始化,系统所有栏目数据丢失,检查ORACLE数据库各表,发现所有表数据全部丢失。
二. 原因分析:
ORACLE数据库数据被执行了初始化操作。
三. 解决方案:
(一)恢复各数据表:
1、 选择“Recycle bin”文件夹,查看文件夹下是否有被删除的数据库表,检查各表是否存在数据。
2、 如果“Recycle bin”文件夹下有数据库表(就是之前被删除的表)且表中存在数据,我们即可恢复各数据表数据。
3、 选择“Tables”文件夹下的第一个表“CDR”,点击鼠标右键,选择“Rename”,对数据表进行重命名。例如,在CDR后输入“_f”回车。
4、 选择“Recycle bin”文件夹下的表“CDR”,点击鼠标右键,选择“Restore”。此时,“Recycle bin”文件夹下的表“CDR”不见了。
5、 选择“Tables”文件夹,点击鼠标右键,选择“Refresh”。此时,我们可以在该文件下看到一个“CDR”表和一个“CDR_F”表。
6、 选择“CDR”表,点击鼠标右键,选择“Query data”,查看CDR表中的数据是否正常。
7、 如CDR表中数据正常,我们就可以将“CDR_F”表进行删除。
8、 按照以上操作步骤依次恢复各数据表。
备注:如在“Recycle bin”文件夹和“Tables”文件夹存在相同表,则需要安装以上操作进行数据恢复;如在“Recycle bin”文件夹下存在,但“Tables”文件夹下不存在,则可以直接进行“Restore”操作。
(二)重新启动数据库:
1、 登录oracle命令控制台
su - oracle
2、 查看oracle数据库服务器的实例名
echo $ORACLE_SID
3、 进入oracle的sql命令行
sqlplus /nolog
4、 以管理员身份登录
conn / as sysdba
5、 停止oracle服务
shutdown immediate
6、 启动数据库服务
startup
7、 exit退出sql命令行,进入oracle命令行,启动oracle监听
lsnrctl start|stop
(三)查看并重启系统各项服务:
1、 查看系统各模块服务启动情况
ps –ef|grep java
2、 停止所有已启动的服务
killall -9 java
3、 依次启动各模块服务
4、 待服务启动完毕后,查看BMS管理系统是否已经恢复正常,互动点播系统四大业务是否正常。
3.3.6 现网数据.dmp文件导入方法
作者:黄婷婷
由于现网的数据库脚本为.dmp文件格式,所以导入现网数据需要字符界面导入,对应字符界面导入数据库脚本方法现在做一个介绍。
现网数据的数据库脚本
例如导入dhaaav2.dmp文件
步骤一:利用ftp工具将aaa的现网数据库脚本dhaaav2.dmp上传到oracle用户目录下,例如/home/oracle(也可以存放在其他目录下,但是一定要记住目录,导入数据库脚本前要进入到那里目录下)。
步骤二:以root用户进入到oracle数据库所在服务器,切换到Oracle用户。然后进入到进入dhaaav2.dmp文件存放目录,例如/home/oracle。
步骤三:导入aaa的现网数据dhaaav2.dmp
# imp
Username: jlaaa
Password: coship
Import file: expdat.dmp >dhaaav2.dmp
Enter insert buffer size (minimum is 8192) 30720>默认值(回车)
List contents of import file only (yes/no): no>默认(回车)
Ignore create error due to object existence (yes/no):no>默认(回车)
Import grants (yes/no): yes>默认(回车)
Import table data (yes/no): yes>默认(回车)
Import entire export file (yes/no): no >默认(回车)
Username:jlaaa
Enter table(T) or partition(T:P) name or . if done:回车
数据开始导入,等待导入完成.
屏幕打印’Import terminated successfullywithout warnings’信息.表示数据导入成功.
imp命令
Oracle的导入实用程序(Importutility)允许从数据库提取数据,并且将数据写入操作系统文
件。imp使用的基本格式:imp[username[/password[@service]]]
1)jlaaa为数据库中已存在的用户,在安装aaa的时候前期要创建数据库表空间和用户,导入初始化数据库脚本,在这个时候创建的用例。导入数据前请确保数据库中用户已存在;创建用户的操作请参见aaa的安装指南。
2)Coship为aaa数据库用户jlaaa的密码。
3)Import file:expdat.dmp >dhaaav2.dmp 需要导入现网数据文件的名称
4)导入过程一直默认选择回车操作即可,中间过程中需要再一次输入数据库用户名称。
5)成功导入有提示信息:Importterminated successfully without warnings
Cms和iepg现网数据库脚本导入同理上面的操作,具体修改一下脚本名称即可。
说明:脚本导入完成之后可以分别登陆三个数据库查看现网数据是否成功写入。