- 在 Oracle 中,下面哪个命令可以修改用户的默认密码有效期为无限制?(单选)
A. ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90;
ORACLE 修改默认密码有效期 180 天为无限制
1、查看用户的 proifle 是哪个,一般是 default:
sql>SELECT username,PROFILE FROM dba_users;
2、查看指定概要文件(如 default)的密码有效期设置:
sql>SELECT * FROM dba_profiles s WHERE s.profile=‘DEFAULT’ AND resource_name=‘PASSWORD_LIFE_TIME’;
3、将密码有效期由默认的 180 天修改成“无限制”:
sql>ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
修改之后不需要重启动数据库,会立即生效。
4、修改后,还没有被提示 ORA-28002 警告的帐户不会再碰到同样的提示;
已经被提示的帐户必须再改一次密码,举例如下:
$sqlplus / as sysdba
sql> alter user 用户名 identified by <原来的密码> ----不用换新密码
oracle11g 启动参数 resource_limit 无论设置为 false 还是 true,密码有效期都是生效的,所以必须通过以上方式进行修改。以上的帐户名请根据实际使用的帐户名更改。
- 关于数据库处于 ARCHIVELOG 模式下的说法正确的是?(单选)
C.在数据库开启时可以进行全备。
解析:归档模式下可进行全库的热备。没有归档的全库备份无法用来进行完全恢复,因为缺少日志。
3.默认情况下,AWR 的快照会定期删除,因此导致无法比较一个很长区间的活动(比如今年的年末和去年的年末)。如下那种是实现这一目标的最佳方法?(单选)
B.保存年末快照为基线
解析:快照超过设置的 retention(wrm$_wr_control.retention)区间就会被清理。
调大快照保留区间足够大虽然可以避免历史快照被清理,但对本案例并不是最优的方法。
baseline 是一段特定时间内的 snapshot 的集合,当异常发生时,使用异常时间段的snapshot 和 baseline 进行对比。baseline 中的 snapshot不受 AWR retention 的限制。
因此通过将关注的快照区间设置为基线并设置合适的过期时间(DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE 的 expiration 参数),就可以确保这些快照不会被删除。
SYSAUX 用于存储快照数据,但是保留时间和空间无关。
STATISTICS_LEVEL 控制采集数据的详细程度,和保留多长时间无关。
4. 下述哪个内存组件在实例启动后无法动态伸缩?(单选)
D.log buffer
解析:log buffer 是在实例启动时固定分配的,其他组件均为可伸缩组件。
5. 关于自连接那两个说法是正确的?(多选)
A.它可以是左外连接
D.它可以是一个内连接
解析:相同表的关联可以是左外连接可以是内连接,没有必须是哪种连接方法。
6. 以下关于 ORACLE 缓冲池的描述,正确的是?(多选)
A.Recycle Pool 用于存储临时使用的、不被经常使用的较大的对象,避免导致默认池和保持池中的块老化而退出缓存。
B. DEFAULT Pool 采用 LRU 管理,更热的对象频繁访问时,原有 LRU 冷端的对象可能被 age out。
D.Keep Pool 中并不是热点表一直能够缓存,当 keep pool 不够的时候,最先缓存到 keep pool 的对象会被挤出
解析:Keep Buffer Pool 的作用是缓存那些需要经常查询的对象但又容易被默认缓冲区置换出去的对象,按惯例,Keep pool 设置为合理的大小,以使其中存储的对象不再age out,也就是查询这个对象的操作不会引起磁盘IO操作,可以极大地提高查询性能。
并不是我们设置了 keep pool 之后,热点表就一定能够缓存在 keep pool ,keep pool 同样也是由 LRU 链表管理的,当 keep pool 不够的时候,最先缓存到 keep pool 的对象会被挤出,不过与 default pool 中的 LRU 的管理方式不同,在 keep pool 中表永远是从 MRU 移动到 LRU,不会由于你做了 F TS 而将表缓存到 LRU 端,在 keep pool 中对象永远是先进先出。
Recycle Buffer Pool 正好相反。Recycle Buffer Pool 用于存储临时使用的、不被经常使用的较大的对象,这些对象放置在 Default Buffer Pool 显然是不合适的,这些块会导致过量的缓冲区刷新输出,而且不会带来任何好处,因为等你想要再用这个块时,它可已经老化退出了缓存。要把这些段与默认池和保持池中的段分开,这样就不会导致默认池和保持池中的块老化而退出缓存。
7. 以下哪个参数可以控制笛卡尔积访问方式?(多选)
B._optimizer_mjc_enabled
C._optimizer_cartesian_enabled
答案:BC 解析:_optimizer_cartesian_enabled:控制是否允许笛卡尔积访问;
_optimizer_mjc_enabled:控制是否允许 merge join 笛卡尔积访问;
_b_tree_bitmap_plans:–控制位图索引转化; optimizer_index_cost_adj:调整索引扫描的转换成本百分比。
8. PG数据库中包含以下哪几种表连接方式?(多选)
B.NESTLOOP JOIN
C.HASH JOIN
D.MERGE JOIN
答案:BCD
解析:◆Nestloop Join
嵌套循环连接(Nestloop Join)是在两个表做连接时最朴素的一种连接方式。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(>10000不适合),要把返回子集较小的表作为外表,而且在内表的连接字段上要有索引,否则会很慢。
执行的过程:确定一个驱动表(outer table),另一个表为 inner table,驱动表中的每一行与 inner 表中的相应记录 JOIN,类似一个嵌套的循环。适用于驱动表的记录集比较小(<10000)而且 inner 表有有效的访问方法(index)。需要注意的是,JOIN 的顺序很重要,驱动表(outer table)的记录集一定要小,返回的结果集的相应时间是最快的
◆Hash Join
优化器使用两个表中较小的表,并利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。
这种方式适用于较小的表可以完全放入内容的情况,这样总成本就是访问两个表的成本之和。但是如果表很大,不能完全放入内存,优化器会将它分割成若干不同的分区,把不能放入内存的部分写入磁盘的临时段,此时要有较大的临时段以便尽量提高I/O的性能。
◆Merge Join
通常情况下散列表连接的效果比合并连接好,然而如果源数据上有索引,或者结果已经被排过序,在执行排序合并连接时就不需要排序了,这时合并连接的性能会优于是散列连接。
9. 以下哪种方法可以回收表段中的可用空间?(多选)
A.alter table … move;
B.alter table … shrink space compact;
C.通过create table as select (CTAS)重建表
答案:ABC 解析:alter table shrink space compact
会移动表中的行并整理表上的碎片,但并不会调整高水位,也不会释放已占用的空间。只有不带 compact 选项时,才会调整高水位并释放空间。
10. 以下关于外连接的写法,哪些是正确的?(多选)
B、select * from emp,dept2 where emp.deptno=dept2.deptno(+) and dept2.deptno(+)=20 ;
D、select * from emp left join dept2 using(deptno) ;
答案:BD
【答案解析】select * from emp left join dept2 on emp.deptno=dept2.deptno where dept2.deptno=20、 select * from emp,dept2 where emp.deptno=dept2.deptno(+) and dept2.deptno=20:会在最后进行过滤,失去了外连接的效果。
11.以下关于实例内存和会话内存,下面哪2种说法是正确的:?
C、SGA被所有会话写入;但是PGA只能被一个会话写入 【正确答案】
D、会话能写PGA,但是不能写SGA E、SGA在实例启动时分配 【正确答案】
12.DBWn进程是Oracle负责将脏块写入磁盘的后台进程,如果我们要加快它写出块的速度,可以配置多个DBWn进程,那么在Oracle 11g中最多可以配多少个呢?
D、36
解析:D
11g 36 个 ,12c 64 个
13.以下关于Oracle分区索引的表述,哪些是正确的?
B、不可以创建非前缀全局分区索引
C、与表分区方法相同的,是本地分区索引,与表分区的方法不相同的,是全局分区索引。
D、分区索引所在的基表需要为分区表
E、分区索引主要有本地分区索引和全局分区索引
解析:BCE
1、索引是否分区与表是否分区无关。2、可以创建本地分区的唯一索引,但需要将分区键列加入做为索引列。3、Oracle不支持创建非前缀全局分区索引
4、与索引所在分区表的分区方法相同的,是本地分区索引,反之,是全局分区索引。
14.以下哪些描述适用于位图索引?
A、需要更少的索引存储空间
B、可以创建复合索引
C、会存储索引列全空的记录
D、可以创建基于函数的索引
E、可以创建压缩索引
解析:ABCD
由于位图索引是用一个二进制位表示一行,所以,其所需要的索引空间会比较少。由于位图索引是用一个二进制位表示一行,所以,其所需要的索引空间会比较少。位图索引会存储索引列为空值的记录。位图索引可以创建基于函数的索引,也可以创建复合索引。但不能创建压缩的位图索引。
15.为了获取GV$SQL视图的定义,以下哪个方法可以得到正确的视图定义?
C、select view_definition from gv$fixed_view_definition where view_name='GV$SQL';
解析:C
数据库启动时,会创建名为GV S Q L 的 F I X E D V I E W 。 其 视 图 定 义 文 本 可 以 在 G V SQL的FIXED_VIEW。其视图定义文本可以在GV SQL的FIXEDVIEW。其视图定义文本可以在GVFIXED_VIEW_DEFINITION中查到。然后继续创建名为GV_ S Q L ( 注 意 有 下 划 线 ) 的 视 图 和 名 为 G V SQL(注意有下划线)的视图和名为GV SQL(注意有下划线)的视图和名为GVSQL的公有同义词,该公有同义词指向GV_KaTeX parse error: Expected group after '_' at position 56: …_ddl('VIEW','GV_̲SQL’,‘SYS’)查询到视图GV_ S Q L 的 定 义 文 本 , 但 这 两 种 方 法 获 取 的 定 义 文 本 并 不 是 G V SQL的定义文本,但这两种方法获取的定义文本并不是GV SQL的定义文本,但这两种方法获取的定义文本并不是GVSQL视图的定义文本,而是GV_ S Q L 视 图 的 定 义 文 本 , 在 该 定 义 文 本 中 , F R O M 子 句 中 的 对 象 是 G V SQL视图的定义文本,在该定义文本中,FROM子句中的对象是GV SQL视图的定义文本,在该定义文本中,FROM子句中的对象是GVSQL。而从GV F I X E D V I E W D E F I N I T I O N 中 查 到 的 G V FIXED_VIEW_DEFINITION中查到的GV FIXEDVIEWDEFINITION中查到的GVSQL的定义文本,其FROM子句后面的对象才是内部对象表x$kglcursor_child。
16.以下的层次查询中的各个子句,其执行顺序为何?d
1 select *
2 from tab1
3 where
4 start with
5 connect by
D、2->4->5->3->1
解析:D SELECT … FROM + 表名 WHERE + 条件3 START WITH + 条件1 CONNECT BY
PRIOR + 条件2
17.关于ORACLE的保留关键字OPT_PARAM的描述,正确的是?
A、OPT_PARAM用法为:/*+ OPT_PARAM(‘隐藏参数值’,‘true/false’) */
B、OPT_PARAM关键字可以在SQL级别通过加HINT的方式来调整单个SQL执行的时候所依赖的系统参数的值
解析:AB
OPT_PARAM关键字可以在SQL级别通过加HINT的方式来调整单个SQL执行的时候所依赖的系统参数的值;OPT_PARAM关键字后的参数信息如果不完整或只写OPT_PARAM关键字,相当于保留关键字,会导致保留关键字后的HINT都被忽略,使用时需注意。
18.客户端的字符集为GB2312,数据库的字符集为AL32UTF8。请问,以下哪个设置NLS_LANG的方法,可以保证在数据库中存储正确编码的字符?
A、export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
解析:A NLS_LANG 需要设置为客户端字符集或者为超级。
19.以下并行的hint写法哪些是正确并且高效的
A、 /*+ parallel_index(a idx_01 8) /
B、/+ parallel(a 8) */
解析:AB A会导致优化器使用自动并行度。B会使得SQL中的所有表在某些情况下,都选择并行执行。C写法错误,索引的并行是/+
parallel_index(table_name index_name degree)/.
20.Oracle数据库中可通过V$SORT_USAGE动态视图查询当前实例各会话临时段使用情况,下列关于临时段描述正确的是?
A、使用GROUP BY和UNION语法的SQL语句,如分组和合并的数据量较大超过PGA排序区容量时,可能会使用到临时表空间。【正确答案】
B、使用会话表(GT_SESS_TAB)插入数据后,在同一个会话中使用删除语句(DELETE)语句无法释放临时段。DELETE FROM GT_SESS_TAB; 【正确答案】
C、使用事务表(GT_TRANS_TAB)插入数据后,在同一个会话中提交或回滚事务操作无法释放临时段。INSERT INTO GT_TRANS_TAB(TMP_ID) VALUES(123); COMMIT;
D、使用长字符聚合查询(如:WM_CONCAT)返回大字段或插入到全局临时表中包含大字段值,这2类操作均会生产临时段,且临时段类型为LOB_DATA(V$SORT_USAGE.SGTYPE='LOB_DATA') SELECT WM_CONCAT(COL_CHAR) CHAR_CLOB FROM T_CHAR_TAB; INSERT INTO GT_SESS_TAB(COL_CLOB) VALUES('123'); 【正确答案】
E、往如下全局临时表(GLOBAL TEMPORARY TABLE)插入数值型记录时,会话表GT_SESS_TAB(DBA_TABLES.DURATION='SYS$SESSION')和事务表GT_TRANS_TAB(DBA_TABLES.DURATION='SYS$TRANSACTION')这2类全局临时表均会生产临时段,且临时段类型为DATA(V$SORT_USAGE.SGTYPE='DATA') INSERT INTO GT_SESS_TAB(TMP_ID) VALUES(123); INSERT INTO GT_TRANS_TAB(TMP_ID) VALUES(123); 【正确答案】
F、在Oracle 11G或以上版本,除了通过断开会话连接释放临时段外,也可通过ALTER TABLESPACE TEMP SHRINK SPACE命令来降低临时表空间占用率。【正确答案】
【答案解析】ABDEF
插入到全局临时表均使用临时表空间存储,存储数据段(SEGMENT)为临时段
会话表需断开会话或使用前后使用TRUNCATE语句释放临时段
提交或回滚事务时,Oracle内部自动管理并释放事务表的临时段
聚合返回CLOB段和插入带LOB段的会话表,均会产生LOB段类型的临时段。插入带LOB段全局临时表时,还带有LOB段对应INDEX类型的临时段。
Oracle数据库中断开会话即可释放临时段,11G以上版本还提供了临时段收缩命令 ALTER TABLESPACE TEMP SHRINK SPACE
UNION语句实际执行计划中带有SORT UNION操作,涉及排序排重操作,大数据量较大时可能会使用到临时表空间。分组HASH GROUP BY同样使用到排序和临时段。
说明:以上题目及答案解析均来自墨天轮各位认证专家,本次只做了收集与整理,如有侵犯,请联系会及时处理,谢谢!
Oracle ADG 切换场景及具体切换步骤
计划内切换
(1)检查主库
select switchover_status from v$database;
SWITCHOVER_STATUS
SESSIONS ACTIVE
if [ switchover_status = "SESSIONS ACTIVE" | switchover_status = "TO STANDBY" ];
then { go to next step }
else { cancel switchover and check database }
(2)主库切为备库
alter database commit to switchover to physical standby with session shutdown;
shutdown immediate;
startup mount;
(3)检查备库
select switchover_status from v$database;
SWITCHOVER_STATUS
TO PRIMARY
if [ switchover_status = "SESSIONS ACTIVE" | switchover_status = "TO PRIMARY" ];
then { go to next step }
else { cancel switchover and check database }
(4)备库切为主库
alter database commit to switchover to PRIMARY with session shutdown;
(5)原主库恢复日志应用
alter database recover managed standby database using current logfile disconnect from session;
■ 计划外切换
一、主备库日志没有缺口的场景
(1)备库检查日志缺口
select thread#,low_sequence#,high_sequence# from v$archive_gap;
未选定行
(2)备库停止日志接受并完成已收日志应用
alter database recover managed standby database cancel;
alter database recover managed standby database finish;
(3)检查备库状态
select switchover_status from v$database;
SWITCHOVER_STATUS
TO PRIMARY
if [ switchover_status = "SESSIONS ACTIVE" | switchover_status = "TO PRIMARY" ];
then { go to next step }
else { cancel switchover and check database }
(4)备库切为主库
alter database commit to switchover to PRIMARY with session shutdown;
alter database open;
二、主库可以打开到 mount 状态
(1)将主库日志刷到备库
alter system flush redo to target_db_name;
(2)备库停止日志接受并完成已收日志应用
alter database recover managed standby database cancel;
alter database recover managed standby database finish;
(3)检查备库状态
select switchover_status from v$database;
SWITCHOVER_STATUS
TO PRIMARY
if [ switchover_status = "SESSIONS ACTIVE" | switchover_status = "TO PRIMARY" ];
then { go to next step }
else { cancel switchover and check database }
(4)备库切为主库
alter database commit to switchover to PRIMARY with session shutdown;
alter database open;
三、主备库间日志缺口无法纠正
(1)强制激活备库
alter database activate physical standby database;
alter database open;
四、oracle常用命令
查日期:
select * from crd_cardmain where to_char(mindate,'YYYY-MM-DD')='20080826'
一、ORACLE的启动和关闭
1、在单机环境下
要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下
su - oracle
a、启动ORACLE系统
oracle>svrmgrl
SVRMGR>connect internal
SVRMGR>startup
SVRMGR>quit
b、关闭ORACLE系统
oracle>svrmgrl
SVRMGR>connect internal
SVRMGR>shutdown
SVRMGR>quit
启动oracle9i数据库命令:
$ sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on Fri Oct 31 13:53:53 2003
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup^C
SQL> startup
ORACLE instance started.
2、在双机环境下
要想启动或关闭ORACLE系统必须首先切换到root用户,如下
su - root
a、启动ORACLE系统
hareg -y oracle
b、关闭ORACLE系统
hareg -n oracle
Oracle数据库有哪几种启动方式
说明:
有以下几种启动方式:
1、startup nomount
非安装启动,这种方式启动下可执行:重建控制文件、重建数据库。
读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。
2、startup mount dbname
安装启动,这种方式启动下可执行:
数据库日志归档、数据库介质恢复、使数据文件联机或脱机,重新定位数据文件、重做日志文件。
执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置,
但此时不对数据文件和日志文件进行校验检查。
3、startup open dbname
这种方式下可访问数据库中的数据。
先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件。
4、startup,等于以下三个命令
startup nomount
alter database mount
alter database open
5、startup restrict
约束方式启动
这种方式能够启动数据库,但只允许具有一定特权的用户访问。
非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用
6、startup force
强制启动方式。
当不能关闭数据库时,可以用startup force来完成数据库的关闭。
先关闭数据库,再执行正常启动数据库命令。
7、startup pfile=参数文件名
带初始化参数文件的启动方式。
先读取参数文件,再按参数文件中的设置启动数据库
例:startup pfile=E:Oracleadminoradbpfileinit.ora
8、startup EXCLUSIVE
二、用户如何有效地利用数据字典
ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化,体现为sys用户下的一些表和视图。
数据字典名称是大写的英文字符。数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。我们不能手工修改数据字典里的信息。
很多时候,一般的ORACLE用户不知道如何有效地利用它。
dictionary
全部数据字典表的名称和解释,它有一个同义词dict
dict_column
全部数据字典表里字段名称和解释
如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句:
SQL>select * from dictionary where instr(comments,'index')>0;
如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:
SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES';
依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。
下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。
1、用户
查看当前用户的缺省表空间
SQL>select username,default_tablespace from user_users;
查看当前用户的角色
SQL>select * from user_role_privs;
查看当前用户的系统权限和表级权限
SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
2、表
查看用户下所有的表
SQL>select * from user_tables;
查看名称包含log字符的表
SQL>select object_name,object_id from user_objects
where instr(object_name,'LOG')>0;
查看某表的创建时间
SQL>select object_name,created from user_objects where object_name=upper('&table_name');
查看某表的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&table_name');
查看放在ORACLE的内存区里的表
SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
3、索引
查看索引个数和类别
SQL>select index_name,index_type,table_name from user_indexes order by table_name;
查看索引被索引的字段
SQL>select * from user_ind_columns where index_name=upper('&index_name');
查看索引的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&index_name');
4、序列号
查看序列号,last_number是当前值
SQL>select * from user_sequences;
5、视图
查看视图的名称
SQL>select view_name from user_views;
查看创建视图的select语句
SQL>set view_name,text_length from user_views;
SQL>set long 2000;
说明:可以根据视图的text_length值设定set long 的大小
SQL>select text from user_views where view_name=upper('&view_name');
6、同义词
查看同义词的名称
SQL>select * from user_synonyms;
7、约束条件
查看某表的约束条件
SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
rom user_constraints where table_name = upper('&table_name');
SQL>select c.constraint_name,c.constraint_type,cc.column_name
from user_constraints c,user_cons_columns cc
where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
and c.owner = cc.owner and c.constraint_name = cc.constraint_name
order by cc.position;
8、存储函数和过程
查看函数和过程的状态
SQL>select object_name,status from user_objects where object_type='FUNCTION';
SQL>select object_name,status from user_objects where object_type='PROCEDURE';
查看函数和过程的源代码
SQL>select text from all_source where owner=user and name=upper('&plsql_name');
三、查看数据库的SQL
1、查看表空间的名称及大小
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;
2、查看表空间物理文件的名称及大小
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
3、查看回滚段名称及大小
select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name ;
4、查看控制文件
select name from v$controlfile;
5、查看日志文件
select member from v$logfile;
6、查看表空间的使用情况
select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space
group by tablespace_name;
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
7、查看数据库库对象
select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;
8、查看数据库的版本
Select version FROM Product_component_version
Where SUBSTR(PRODUCT,1,6)='Oracle';
9、查看数据库的创建日期和归档方式
Select Created, Log_Mode, Log_Mode From V$Database;
四、ORACLE用户连接的管理
用系统管理员,查看当前数据库有几个用户连接:
SQL> select username,sid,serial# from v$session;
如果要停某个连接用
SQL> alter system kill session 'sid,serial#';
如果这命令不行,找它UNIX的进程数
SQL> select pro.spid from v$session ses,v$process pro where ses.sid=21 and ses.paddr=pro.addr;
说明:21是某个连接的sid数
然后用 kill 命令杀此进程号。
五、SQL*PLUS使用
a、进入SQL*Plus
$sqlplus 用户名/密码
退出SQL*Plus
SQL>exit
b、在sqlplus下得到帮助信息
列出全部SQL命令和SQL*Plus命令
SQL>help
列出某个特定的命令的信息
SQL>help 命令名
c、显示表结构命令DESCRIBE
SQL>DESC 表名
d、SQL*Plus中的编辑命令
显示SQL缓冲区命令
SQL>L
修改SQL命令
首先要将待改正行变为当前行
SQL>n
用CHANGE命令修改内容
SQL>c/旧/新
重新确认是否已正确
SQL>L
使用INPUT命令可以在SQL缓冲区中增加一行或多行
SQL>i
SQL>输入内容
e、调用外部系统编辑器
SQL>edit 文件名
可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件中定义如下一行
DEFINE_EDITOR=vi
f、运行命令文件
SQL>START test
SQL>@test
常用SQL*Plus语句
a、表的创建、修改、删除
创建表的命令格式如下:
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));
b、将一张表删除语句的格式如下:
DORP TABLE 表名;
例:表删除将同时删除表的数据和表的定义
sql>drop table test
c、表空间的创建、删除
六、ORACLE逻辑备份的SH文件
完全备份的SH文件:exp_comp.sh
rq=` date +"%m%d" `
su - oracle -c "exp system/manager full=y inctype=complete file=/oracle/export/db_comp$rq.dmp"
累计备份的SH文件:exp_cumu.sh
rq=` date +"%m%d" `
su - oracle -c "exp system/manager full=y inctype=cumulative file=/oracle/export/db_cumu$rq.dmp"
增量备份的SH文件: exp_incr.sh
rq=` date +"%m%d" `
su - oracle -c "exp system/manager full=y inctype=incremental file=/oracle/export/db_incr$rq.dmp"
root用户crontab文件
/var/spool/cron/crontabs/root增加以下内容
0 2 1 * * /oracle/exp_comp.sh
30 2 * * 0-5 /oracle/exp_incr.sh
45 2 * * 6 /oracle/exp_cumu.sh
当然这个时间表可以根据不同的需求来改变的,这只是一个例子。
七、ORACLE 常用的SQL语法和数据对象
一.数据控制语句 (DML) 部分
1.INSERT (往数据表里插入记录的语句)
INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……);
INSERT INTO 表名(字段名1, 字段名2, ……) SELECT (字段名1, 字段名2, ……) FROM 另外的表名;
字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’
如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个单引号’’.
字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验.
日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒
或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)
TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.
年-月-日小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS
INSERT时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,
方法借用ORACLE里自带的DBMS_LOB程序包.
INSERT时如果要用到从1开始自动增长的序列号, 应该先建立一个序列号
CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1
MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999
INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL
2.DELETE (删除数据表里记录的语句)
DELETE FROM表名 WHERE 条件;
注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些被删除的数据块标成unused.
如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间
TRUNCATE TABLE 表名;
此操作不可回退.
3.UPDATE (修改数据表里记录的语句)
UPDATE表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件;
如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL, 最好在修改前进行非空校验;
值N超过定义的长度会出错, 最好在插入前进行长度校验…
注意事项:
A. 以上SQL语句对表都加上了行级锁,
确认完成后, 必须加上事物处理结束的命令 COMMIT 才能正式生效,
否则改变不一定写入数据库里.
如果想撤回这些操作, 可以用命令 ROLLBACK 复原.
B. 在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围,
应该把它限定在较小 (一万条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段.
程序响应慢甚至失去响应. 如果记录数上十万以上这些操作, 可以把这些SQL语句分段分次完成,
其间加上COMMIT 确认事物处理.
二.数据定义 (DDL) 部分
1.CREATE (创建表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等)
ORACLE常用的字段类型有
CHAR
固定长度的字符串
VARCHAR2
可变长度的字符串
NUMBER(M,N)
数字型M是位数总长度, N是小数的长度
DATE
日期类型
创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面
创建表时可以用中文的字段名, 但最好还是用英文的字段名
创建表时可以给字段加上默认值, 例如 DEFAULT SYSDATE
这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间
创建表时可以给字段加上约束条件
例如不允许重复 UNIQUE, 关键字 PRIMARY KEY
2.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;
3.DROP (删除表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等)
删除表和它所有的约束条件
DROP TABLE 表名 CASCADE CONSTRAINTS;
4.TRUNCATE (清空表里的所有记录, 保留表的结构)
TRUNCATE 表名;
三.查询语句 (SELECT) 部分
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 条件;
字段名可以带入函数
例如: COUNT(*), MIN(字段名), MAX(字段名), AVG(字段名), DISTINCT(字段名),
TO_CHAR(DATE字段名,'YYYY-MM-DD HH24:MI:SS')
NVL(EXPR1, EXPR2)函数
解释:
IF EXPR1=NULL
RETURN EXPR2
ELSE
RETURN EXPR1
DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数
解释:
IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..…
ELSE
RETURN NULL
LPAD(char1,n,char2)函数
解释:
字符char1按制定的位数n显示,不足的位数用char2字符串替换左边的空位
字段名之间可以进行算术运算
例如: (字段名1*字段名1)/3
查询语句可以嵌套
例如: SELECT …… FROM
(SELECT …… FROM表名1, [表名2, ……] WHERE 条件) WHERE 条件2;
两个查询语句的结果可以做集合操作
例如: 并集UNION(去掉重复记录), 并集UNION ALL(不去掉重复记录), 差集MINUS, 交集INTERSECT
分组查询
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] GROUP BY字段名1
[HAVING 条件] ;
两个以上表之间的连接查询
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE
表名1.字段名 = 表名2. 字段名 [ AND ……] ;
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE
表名1.字段名 = 表名2. 字段名(+) [ AND ……] ;
有(+)号的字段位置自动补空值
查询结果集的排序操作, 默认的排序是升序ASC, 降序是DESC
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……]
ORDER BY字段名1, 字段名2 DESC;
字符串模糊比较的方法
INSTR(字段名, ‘字符串’)>0
字段名 LIKE ‘字符串%’ [‘%字符串%’]
每个表都有一个隐含的字段ROWID, 它标记着记录的唯一性.
四.ORACLE里常用的数据对象 (SCHEMA)
1.索引 (INDEX)
CREATE INDEX 索引名ON 表名 ( 字段1, [字段2, ……] );
ALTER INDEX 索引名 REBUILD;
一个表的索引最好不要超过三个 (特殊的大表除外), 最好用单字段索引, 结合SQL语句的分析执行情况,
也可以建立多字段的组合索引和基于函数的索引
ORACLE8.1.7字符串可以索引的最大长度为1578 单字节
ORACLE8.0.6字符串可以索引的最大长度为758 单字节
2.视图 (VIEW)
CREATE VIEW 视图名AS SELECT …. FROM …..;
ALTER VIEW视图名 COMPILE;
视图仅是一个SQL查询语句, 它可以把表之间复杂的关系简洁化.
3.同义词 (SYNONMY)
CREATE SYNONYM同义词名FOR 表名;
CREATE SYNONYM同义词名FOR 表名@数据库链接名;
4.数据库链接 (DATABASE LINK)
CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘数据库连接字符串’;
数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义.
数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查询远端数据库里的表
SELECT …… FROM 表名@数据库链接名;
五.权限管理 (DCL) 语句
1.GRANT 赋于权限
常用的系统权限集合有以下三个:
CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理)
常用的数据对象权限有以下五个:
ALL ON 数据对象名, SELECT ON 数据对象名, UPDATE ON 数据对象名,
DELETE ON 数据对象名, INSERT ON 数据对象名, ALTER ON 数据对象名
GRANT CONNECT, RESOURCE TO 用户名;
GRANT SELECT ON 表名 TO 用户名;
GRANT SELECT, INSERT, DELETE ON表名 TO 用户名1, 用户名2;
2.REVOKE 回收权限
REVOKE CONNECT, RESOURCE FROM 用户名;
REVOKE SELECT ON 表名 FROM 用户名;
REVOKE SELECT, INSERT, DELETE ON表名 FROM 用户名1, 用户名2;
查询数据库中第63号错误:
select orgaddr,destaddr from sm_histable0116 where error_code='63';
查询数据库中开户用户最大提交和最大下发数:
select MSISDN,TCOS,OCOS from ms_usertable;
查询数据库中各种错误代码的总和:
select error_code,count(*) from sm_histable0513 group by error_code order
by error_code;
查询报表数据库中话单统计种类查询。
select sum(Successcount) from tbl_MiddleMt0411 where ServiceType2=111
select sum(successcount),servicetype from tbl_middlemt0411 group by servicetype
Oracle 常用运维命令整理
一、oracle建库与删库命令
(1)oracle11g
建库(一般习惯配置gdbname与sid名一样,sys密码与system密码一样,以方便记忆)
[oracledb@ ~]$ dbca -silent -createDatabase -templateName /u01/oracle/product/11.2.0/dbhome_1/assistants/dbca/templates/General_Purpose.dbc -gdbname GDBNAME -sid SIDNAME -characterSet AL32UTF8 -NATIONALCHARACTERSET UTF8 -sysPassword SYSPASSWORD -systemPassword SYSTEMPASSWORD -TOTALMEMORY 2048
删库方法一:
[oracledb@ ~]$ dbca -silent -deleteDatabase -sourceDB SIDNAME -sysDBAUserName sys -sysDBAPassword SYSPASSWORD
删除库方法二:
#步骤1:配置回应文件:
[oracledb@ ~]$ cat /u01/oracle/response/dbca.rsp
OPERATION_TYPE = "deleteDatabase"
SOURCEDB = "SIDNAME"
SYSDBAUSERNAME = "sys"
SYSDBAPASSWORD = "SYSPASSWORD"
#步骤2:执行回应文件删库:
[oracledb@ ~]$ dbca -silent -responseFile /u01/oracle/response/dbca.rsp
(2)oracle12c 建库
[oracledb@ ~]$ dbca -silent -createDatabase -templateName /u01/oracle/product/orahome/assistants/dbca/templates/General_Purpose.dbc -gdbname GDBNAME -sid SIDNAME -characterSet AL32UTF8 -NATIONALCHARACTERSET UTF8 -sysPassword SYSPASSWORD -systemPassword SYSTEMPASSWORD -TOTALMEMORY 2048
#删库命令同上,注意运行删库命令之后,需要手动删除遗留的目录
(3)删除一般会自动删除以下路径或文件中的库信息
A:/u01/oracle/admin/SIDNAME
B:cat /etc/oratab
C:/u01/oracle/oradata/SIDNAME
以下路径需要手动清理
D:/u01/oracle/cfgtoollogs/dbca/SIDNAME
E:/u01/oracle/diag/rdbms/SIDNAME
F:/u01/oracle/product/11.2.0/dbhome_1/dbs/hc_SIDNAME.dat
二、创建库对应的账号密码
1、切换SID
[oracledb@ ~]$ export ORACLE_SID=SIDNAME
2、切换字符集
#查看oracle数据库的字符集
SQL> select userenv('language') from dual;
#查看oracle数据库的编码
SQL> select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';
[oracledb@ ~]$ set NLS_LANG=AMERICAN_AMERICA.AL32UTF8 #windows_os
[oracledb@ ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 #linux_os
3、创建库对应的用户信息
SQL> create temporary tablespace SIDNAME_temp tempfile '/u01/oracle/oradata/SIDNAME/SIDNAME_temp.dbf 'size 64m autoextend on next 64m maxsize unlimited extent management local;
SQL> create tablespace SIDNAME_data logging datafile '/u01/oracle/oradata/SIDNAME/SIDNAME_data.dbf' size 64m autoextend on next 64m maxsize 2048m extent management local;
SQL> create user USERNAME identified by USERPASSWORD default tablespace SIDNAME_data temporary tablespace SIDNAME_temp;
SQL> grant connect,resource to USERNAME;
SQL> grant create view to USERNAME;
SQL> grant unlimited tablespace to USERNAME;
SQL> grant create public synonym to USERNAME;
SQL> grant drop public synonym to USERNAME;
SQL> create or replace directory dir_dump as '/u01/oracle/backup';
SQL> grant read,write on directory dir_dump to USERNAME;
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
—根据实例环境修改processes与sessions参数值(需要重启oracle数据库)
SQL> alter system set processes=1000 scope=spfile;
SQL> alter system set sessions=1105 scope=spfile;
知识点:
- oracle11g:sessions值的定义应该大于或者定于1.1processes+5,如果小于1.1processes+5,则oracle在启动时自动将该参数设置为1.1processes+5。这主要是考虑到后台进程发起的session和大约10%的递归session。
- oracle12c:1.1processes+22
#查询当前oracle的并发连接数:
SQL> select count(*) from v$session where status='ACTIVE';
#查看不同用户的连接数:
SQL> select username,count(username) from v$session where username is not null group by username;
#查看所有用户:
select * from all_users;
#当前的连接数
select count(*) from v$process;
#数据库允许的最大连接数
select value from v$parameter where name = 'processes';
三、数据库的还原与备份命令
查看expdp导出备份存储路径:
sql> select * from dba_directories;
1、针对整个库备份与还原操作
- (1)、数据库的备份(注意有时SIDNAME与SCHEMASNAME不一致,要注意使用时区分,一般配置一样的名称,方便记忆的同时,也方便运维。parallel参数根据服务器内存等配置情况添加合理的数值。)
#备份:
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME dumpfile=SIDNAME`date +%Y%m%d`.dmp directory=dir_dump parallel=2
12
- (2)、还原
情况1、原始库与目标库实例名不同(注意有些环境的数据表空间名不是SIDNAME_data,使用时注意核实)
#格式:
[oracledb@ ~]$ impdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DUMPFILE=XXXX.dmp DIRECTORY=dir_dump remap_schema=源SCHEMASNAME:目标SCHEMASNAME remap_tablespace=源_data:目标_data
情况2:源库与目标库实例名相同
#格式:
[oracledb@ ~]$ impdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DUMPFILE=XXXX.dmp DIRECTORY=dir_dump EXCLUDE=STATISTICS
知识扩展:使用EXCLUDE=STATISTICS还原时排除统计,可以使用如下命令完成统计
#命令如下:
SQL> exec dbms_stats.gather_schema_stats(ownname=>'SIDNAME',estimate_percent=>10,degree=>8,cascade=>true,granularity=>'ALL');
2、针对单表备份与还原操作
(1)、备份单表
格式:
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME dumpfile=tablenameXXXX.dmp DIRECTORY=dir_dump tables=TABLENAME
(2)、还原单表
#格式:
[oracledb@ ~]$ impdp USERNAME/USERPASSWORD@SIDNAME dumpfile=tablenameXXXX.dmp DIRECTORY=dir_dump TABLES=TABLENAME TABLE_EXISTS_ACTION=REPLACE
扩展:table_exists_action参数说明
使用imp进行数据导入时,若表已经存在,要先drop掉表,再进行导入。
而使用impdp完成数据库导入时,若表已经存在,有四种的处理方式:
参数(1) skip:默认操作
参数(2) replace:先drop表,然后创建表,最后插入数据
参数(3) append:在原来数据的基础上增加数据
参数(4) truncate:先truncate,然后再插入数据
(3)备份多张表
#格式:
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME dumpfile=tablenameXXXX.dmp DIRECTORY=dir_dump TABLES=源TABLENAME1,源TABLENAME2,.....
(4)还原多张表
#格式:
[oracledb@ ~]$ impdp USERNAME/USERPASSWORD@SIDNAME dumpfile=tablenameXXXX.dmp DIRECTORY=dir_dump remap_table=源TABLENAME1:目标TABLENAME11 TABLE_EXISTS_ACTION=REPLACE
[oracledb@ ~]$ impdp USERNAME/USERPASSWORD@SIDNAME dumpfile=tablenameXXXX.dmp DIRECTORY=dir_dump remap_table=源TABLENAME2:目标TABLENAME22 TABLE_EXISTS_ACTION=REPLACE
3、扩展知识
1)扩展1:
情况1、高版本往低版本导出还原时,如12往11还原时,在12c执行导出时,添加低版本的版本号version=11.1.0.2.0
#格式:
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME dumpfile=XXX.dmp DIRECTORY=dir_dump version=11.1.0.2.0
情况2、低版本往高版本还原时,高版本一般兼容低版本,目前个人运维工作中11往12还原没遇到什么问题。
2)扩展2:
(1)、按指定大小备份,如每份5G大小(parallel是多线程处理,线程数要小于生成文件个数,线程要小于 cpu 线程数)
#备份格式
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DIRECTORY=dir_dump dumpfile=XXX_%U.dmp logfile=expdpXXX.log filesize=5G parallel=16
(2)、多个备份文件还原:
#还原格式
[oracledb@ ~]$ impdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DIRECTORY=dir_dump dumpfile=XXX_%U.dmp logfile=impdpXXX.log parallel=16
3)扩展3
导出过滤不导出某张表:
#格式
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DIRECTORY=dir_dump dumpfile=XXX.dmp exclude=TABLE:\"IN \'TABLENAME\'\"
4)扩展4
不同库还原时不改变数据结构使用truncate参数:
#格式
[oracledb@ ~]$ impdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DIRECTORY=dir_dump dumpfile=XXX.dmp remap_schema=源SCHEMASNAME:目标SCHEMASNAME remap_tablespace=源_data:目标_data TABLE_EXISTS_ACTION=truncate
5)扩展5
导出备份时保留表,清除表数据(query参数):
#格式
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DIRECTORY=dir_dump dumpfile=XXX.dmp logfile=expdpXXX.log query=TABLENAME1:'" where 1=2"',TABLENAME2:'" where 1=2"',........
6)扩展6
导出备份时保留表,清除表数据,同时过滤某两张表
#格式
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DIRECTORY=dir_dump dumpfile=XXX.dmp logfile=expdpXXX.log query=TABLENAME1:'" where 1=2"',TABLENAME2:'" where 1=2"' exclude=TABLE:\"IN \'TABLENAME1\'\'TABLENAME2\'\"
7)扩展7
仅统计数据库各表数据,但不导出,参数estimate_only=y
#格式
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME DIRECTORY=dir_dump estimate_only=y
8)扩展8
导入单表到某临时表:
#格式(涉及统计与索引时添加参数EXCLUDE=STATISTICS EXCLUDE=INDEX)
—sql实现从这张表复制到另一张临时表
SQL> CREATE TABLE 目标TABLENAME AS (SELECT * FROM 源TABLENAME);
—清空表中的数据
SQL> delete from 目标TABLENAME;
[oracledb@ ~]$ impdp USERNAME/USERPASSWORD@SIDNAME DIRECTORY=dir_dump DUMPFILE=tablenameXXX.dmp remap_table=源TABLENAME:目标TABLENAME TABLE_EXISTS_ACTION=REPLACE EXCLUDE=STATISTICS EXCLUDE=INDEX
[oracledb@ ~]$ expdp USERNAME/USERPASSWORD@SIDNAME schemas=SCHEMASNAME ESTIMATE_ONLY=y NOLOGFILE=y FULL=y
9)扩展9
个别sql脚本内容很长,使用PLSQL Developer工具执行时会一直卡住无响应时除使用PLSQL Developer工具的在命令窗口中执行外,也可以使用shell终端执行
#格式
[oracle@localhost ~]$ export ORACLE_SID=SIDNAME
[oracle@localhost ~]$ sqlplus / as sysdba
sql> conn USERNAME/USERPASSWORD@SIDNAME
sql> @/u01/oracle/backup/XXX.sql
10)扩展10
如何正确终止expdp与impdp任务,操作步骤如下:
步骤1、查看视图dba_datapump_jobs
select job_name,state from dba_datapump_jobs;
步骤2、正确停止expdp导出任务使用stop_job
expdp USERNAME/USERPASSWORD@SIDNAME attach=SYS_EXPORT_SCHEMA_02
步骤3、停止任务
Export> stop_job=immediate
Are you sure you wish to stop this job ([yes]/no): yes
步骤4、查看系统中的备份job状态
select owner_name,job_name ,state from dba_datapump_jobs;
扩展:下列命令在交互模式下有效:
HELP: 总结交互命令。
KILL_JOB: 分离和删除作业。
PARALLEL: 更改当前作业的活动 worker 的数目。
PARALLEL=.2
START_JOB: 启动/恢复当前作业。
START_JOB=SKIP_CURRENT 在开始作业之前将跳过作业停止时执行的任意操作。
STATUS :在默认值(0)将显示可用时的新状态的情况下,要监视的频率(以秒计)作业状态。
STATUS[=interval]
STOP_JOB: 顺序关闭执行的作业并退出客户机。
STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。
11)扩展11
#查看DB中的NLS_CHARACTERSET的值
SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
SQL> select * from nls_database_parameters t where t.parameter='NLS_CHARACTERSET';
12)扩展12
关于exp、imp、expdp、impdp
(1)、exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。
(2)、expdp和impdp是服务端的工具程序,他们只能在oracle服务端使用,不能在客户端使用。
(3)、imp只适用于exp导出的文件,不适用于expdp导出文件;impdp只适用于expdp导出的文件,而不适用于exp导出文件。
(4)、对于10g以上的服务器,使用exp通常不能导出0行数据的空表,而此时必须使用expdp导出。
13)扩展13
oracle用户密码有@符号时,expdp与sqlplus连接方式及使用rar压缩备份的文件
@echo off
rem ---- dmp backup directory, same as dump dir
set backup_dir=e:\app\oracle\backup
rem ---- today, day for dmp file remaining
set day=%date:~0,4%%date:~5,2%%date:~8,2%
set remain_day=7
rem --- delete files before 7 days
forfiles /p "%backup_dir%" /d -%remain_day% /c "cmd /c del /f @path"
rem --- export oracle data to dmp file
expdp 用户名/\"xxx@yyy\"@orcl directory=dir_dump dumpfile=用户名_%day%.dmp logfile=用户名_%day%.log schemas=用户名 parallel=4 compression=ALL
rem --- sqlplus conn
sqlplus 用户名/"""xxx@yyy"""@orcl
rem ---- if compress the dumpfile and delete source dumpfile, unmark rem
set rar="C:\Program Files (x86)\WinRAR\WinRAR.exe"
%rar% a -df %backup_dir%\用户名_%day%.rar %backup_dir%\用户名_%day%.dmp %backup_dir%\用户名_%day%.log
四、清理(还原时出错,清用户表空间)
1、删除数据表空间:
#执行语句:
[oracledb@ ~]$ sqlplus / as sysdba
SQL> drop tablespace mepro_data including contents and datafiles cascade constraint;
2、删除临时表空间:
#执行语句:
SQL> drop tablespace mepro_temp including contents and datafiles cascade constraints;
3、删除用户:
#执行语句:
SQL> drop user srmhdld cascade;
4、报用户正在连接,无法删除的解决方法
---方法1:重启并迅速执行drop user语句(个人推荐)
SQL> shutdown immediate;
SQL> startup
---方法2:删除正在连接的session(连接的session连接着很多时,清理耗时,没有方法1快速)
#查询用户会话
SQL> select username,serial#,sid,program,machine,status from v$session where username='USERNAME' AND STATUS='ACTIVE';;
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
---删除相关用户会话
SQL> alter system kill session 'serial#, sid';
参考链接 :
Oracle 每日一题系列合集 :https://mp.weixin.qq.com/s/ogWMh7nIYGJvPaqsvhNDZA
Oracle ADG 切换场景及具体切换步骤 : https://mp.weixin.qq.com/s/UHlCMrbNs6aj59nQ3FlwgQ
Oracle常见操作和命令 https://mp.weixin.qq.com/s/NdkzK7mAaEp4Fe_NbE7Ijw
ORACLE 12C下创建表空间和新用户 : https://e2c.net/2019/03/24/69.html
Oracle 常用运维命令整理 : https://mp.weixin.qq.com/s/SYyK_6NQ_1irMJUWhkFYSg