Oracle数据库常用操作

目录

一、查询数据库执行性能

1、查出oracle当前的被锁对象

SELECT l.session_id sid,
       s.serial#,
       l.locked_mode, --锁模式
       l.oracle_username, --登录用户
       l.os_user_name, --登录机器用户名
       s.machine, --机器名
       s.terminal, --终端用户名
       o.object_name, --被锁对象名
       s.logon_time --登录数据库时间
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
ORDER BY sid, s.serial#;

2、杀掉被锁对象的对应进程进行解锁

alter system kill session '66,58333' --其中66是sid 58333是serial#

3、删除被锁对象进程失败时处理方式

删除时报错ORA-00031: session marked for kill的处理方法

SELECT P.SPID, S.SID, S.SERIAL#, S.USERNAME, S.PROGRAM
FROM V$PROCESS P, V$SESSION S
WHERE P.ADDR=S.PADDR AND S.STATUS='KILLED';

或搜索 查找出spid值

select spid, osuser, s.program
 from v$session s, v$process p
 where s.paddr = p.addr
   and s.sid =66

在oralce机器上执行

kill –9 $SPID

4、各个客户端当前连接数


select count(*),program, machine,osuser from v$session group by program,machine,osuser having count(*) >1;

1)当前连接数


select count(0) from v$process;

2)当前会话数


select count(*) from v$session;

3)系统设置的最大连接数


select value from v$parameter where name='processes';

4)系统设置的最大会话数


select value from v$parameter where name='sessions';

5)系统当前活动的会话数


select count(*) from v$session where status='ACTIVE';

6)按用户名统计会话数


select username,count(username) from v$session where username is not null group by username;

7)修改最大连接数


alter system set processes=2000 scope=spfile;

8)修改最大会话数


alter system set sessions=2205 scope=spfile;

备注:连接和会话修改后必须重启才能生效,他们之间的关系 sessions=(1.1 * processes + 5)

9)查找目标用户的当前进程

select sid,serial# from v$session where username='CSBSYS' AND STATUS='ACTIVE';

断开连接

alter system kill session '35,54311';

备注:通过select 语句可能返回多行记录,所以要多次执行alter语句

5、性能耗时SQL

相关视图


v$sql,v$sqlarea

1)查看CPU消耗时间最多的前10条SQL语句


select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;

2)查看总消耗时间最多的前10条SQL语句

select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.elapsed_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;

3)查看消耗磁盘读取最多的前10条SQL语句


select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;

4)需要大量缓冲读取(逻辑读)操作的查询

select buffer_gets, sql_text from (select sql_text, buffer_gets, dense_rank() over(order by buffer_gets desc) buffer_gets_rank from v$sql) where buffer_gets_rank <= 5;

5)列出使用频率最高的5个

select sql_text, executions from (select sql_text, executions, rank() over(order by executions desc)exec_rank from v$sql) where exec_rank <= 5;

5、查看数据库最近所有的操作

select * from v$sql order by last_active_time desc;

6、查看数据库日志路径

select * from v$logfile;

7、插入和查询性能提升方法

插入数据前删除索引,再执行插入,可大大提高插入效率;
查询数据需根据情况添加合适的索引。索引不是越多越好,越多占用空间大查询反而耗时长。

二、表空间信息查询

相关表

dba_data_files(表空间数据文件),dba_free_space(空闲空间),dba_segments

1、表空间总信息

1)查看表空间

select * from dba_tablespaces;

2)查看表空间利用率

SELECT a.tablespace_name "表空间名",
a.bytes / 1024 / 1024 "表空间大小(M)",
(a.bytes - b.bytes) / 1024 / 1024 "已使用空间(M)",
b.bytes / 1024 / 1024 "空闲空间(M)",
round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "使用比"
FROM (SELECT tablespace_name, sum(bytes) bytes
FROM dba_data_files
GROUP BY tablespace_name) a,
(SELECT tablespace_name, sum(bytes) bytes, max(bytes) largest
FROM dba_free_space
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY ((a.bytes - b.bytes) / a.bytes) DESC;

3)查看空闲表空间


select tablespace_name,sum(bytes), sum(blocks) from dba_free_space group by tablespace_name

4)查看临时表空间文件大小

select * from dba_temp_files  

5)删除表空间

drop tablespace TS_DACM_DATA;

6)删除表空间及数据文件

drop tablespace xxx including datafiles and contents

7)删除表空间或数据文件后释放磁盘空间

解决:删除数据库物理文件,磁盘空间不释放问题
数据库服务器执行命令,查询进程id,通过kill -9 spid杀掉进程即可释放

lsof |grep deleted

2、查看用户占用空间大小

1)查看用户对应的表空间

select distinct tablespace_name from DBA_SEGMENTS t where owner = 'CSBSYS';

2)查看表空间对应的数据文件

select * from dba_data_files where tablespace_name='CSBSYS_DW';

3)查看用户占用的空间大小

select sum(bytes / 1024 / 1024) "占用空间(M)" from SYS.DBA_SEGMENTS t where owner = 'CSBSYS';

4)查看用户各个表占用的空间大小

select segment_name,BYTES from SYS.DBA_SEGMENTS t where owner = 'CSBSYS' ORDER BY BYTES DESC;

5)查看表占用空间大小


select sum(bytes / 1024 / 1024) "占用空间(M)" from SYS.DBA_SEGMENTS t where owner = 'CSBSYS' AND SEGMENT_NAME = 'T_GA_ZA_RKXXGLXT_CZRK'

6)查看数据文件对应的表空间

查看永久表空间对应的数据文件

select TABLESPACE_NAME from dba_data_files where FILE_NAME='数据文件全路径';

查看临时表空间对应的数据文件

select TABLESPACE_NAME from dba_temp_files where FILE_NAME='数据文件全路径';

7)查看数据文件的使用情况

select
  b.file_name 物理文件名,
  b.tablespace_name 表空间,
  b.bytes/1024/1024 大小M,
  (b.bytes-sum(nvl(a.bytes,0)))/1024/1024 已使用M,
  substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5) 利用率
  from dba_free_space a,dba_data_files b
  where a.file_id=b.file_id
  group by b.tablespace_name,b.file_name,b.bytes
  order by b.tablespace_name;

3、查看undo表空间命令


sqlplus / as sysdba

show parameter undo_tablespace

1)undo表空间满的处理

a.创建新的undo表空间


create undo tablespace undotbs2 datafile '/opt/oracle/oradata/ge01/UNDOTBS2.dbf' size 100m autoextend on next 50m maxsize 1000m; 

b.切换UNDO表空间为新的UNDO表空间


alter system set undo_tablespace=undotbs2 scope=both;

c.设置原来的undo表空间offline


alter database datafile '/opt/oracle/oradata/ge01/UNDOTBS1.dbf' offline;

d.删除原来的undo表空间和数据文件


drop tablespace undotbs1 including contents and datafiles;

4、修改表空间大小

1)给表空间增加数据文件


alter tablespace CSBSYS_DW add datafile '/u01/app/oracle/tablespace_sde/CSBSYS_SDE/SDE_CSBSYS_DW_08.dbf' SIZE 1024M AUTOEXTEND ON NEXT 1024M MAXSIZE 20480M ;

临时表空间时则将“datafile”改成“TEMPFILE ”,如下所示:


alter tablespace CSBSYS_TEMP add TEMPFILE '/u01/app/oracle/tablespace_sdc1/CSBSYS_SDC1/SDC1_CSBSYS_TEMP_01.dbf' SIZE 1024M AUTOEXTEND ON NEXT 1024M MAXSIZE 20480M ;

2)增加表空间数据文件大小


alter database datafile '/u01/app/oracle/tablespace/CSBSYS/CSBSYS_DW36.dbf' AUTOEXTEND ON NEXT 1024M MAXSIZE 20480M  ;

临时表空间时则将“datafile”改成“tempfile ”,如下所示:


alter database tempfile ‘/u01/app/oracle/tablespace/CSBSYS/CSBSYS_TEMP.dbf’ AUTOEXTEND ON NEXT 1024M MAXSIZE 20480M  ;

备注:若要修改成无限大则设置20480M改成unlimited,但不建议修改成无限,以免数据空间不足造成数据库异常。

3)缩小表空间数据文件大小

注意:存在空闲的表空间大小才可缩小


alter database datafile '/u01/app/oracle/tablespace/CSBSYS/CSBSYS_DW30.dbf' resize 6600m;  

临时表空间时则将“datafile”改成“tempfile ”,如下所示:


alter database tempfile '/u01/app/oracle/tablespace/CSBSYS/CSBSYS_TEMP.dbf' resize 100M;

4)修改表空间数据大小


  alter database datafile '/database/datafiles/oradata/ORCL/fdbl/PART_BL10.ORA' AUTOEXTEND ON NEXT 10M MAXSIZE 10240M;

5、创建表空间

1)初始化默认表空间


CREATE TABLESPACE CSBZHK_DW DATAFILE 

  '/u01/app/oracle/tablespace/csbzhk/CSBZHK_DW.dbf' SIZE 1024M AUTOEXTEND ON NEXT 10M MAXSIZE 2048M

LOGGING

ONLINE

PERMANENT

EXTENT MANAGEMENT LOCAL AUTOALLOCATE

BLOCKSIZE 8K

SEGMENT SPACE MANAGEMENT AUTO;

2)初始化索引表空间


CREATE TABLESPACE CSBZHK_INDEX DATAFILE 

  '/u01/app/oracle/tablespace/csbzhk/CSBZHK_INDEX.dbf' SIZE 256M AUTOEXTEND ON NEXT 10M MAXSIZE 2048M

LOGGING

ONLINE

PERMANENT

EXTENT MANAGEMENT LOCAL AUTOALLOCATE

BLOCKSIZE 8K

SEGMENT SPACE MANAGEMENT AUTO;

3)初始化大对象表空间


CREATE TABLESPACE CSBZHK_LOB DATAFILE 

  '/u01/app/oracle/tablespace/csbzhk/CSBZHK_LOB.dbf' SIZE 256M AUTOEXTEND ON NEXT 10M MAXSIZE 2048M

LOGGING

ONLINE

PERMANENT

EXTENT MANAGEMENT LOCAL AUTOALLOCATE

BLOCKSIZE 8K

SEGMENT SPACE MANAGEMENT AUTO;

4)初始化临时表空间


CREATE TEMPORARY TABLESPACE CSBZHK_TEMP TEMPFILE 

  '/u01/app/oracle/tablespace/csbzhk/CSBZHK_TEMP.dbf' SIZE 256M AUTOEXTEND ON NEXT 10M MAXSIZE 2048M

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

5)初始化用户


create user CSBZHK

  identified by dragon

  default tablespace CSBZHK_DW

  temporary tablespace CSBZHK_TEMP

  profile DEFAULT;

-- Grant/Revoke role privileges 

grant connect to CSBZHK;

grant resource to CSBZHK;

-- Grant/Revoke system privileges 

grant select any sequence to CSBZHK;

grant select any table to CSBZHK;

grant create database link to CSBZHK;

grant create any synonym to CSBZHK;

grant create any sequence to CSBZHK;

grant create any view to CSBZHK;

grant create any procedure to CSBZHK;

grant create any table to CSBZHK;

grant create any trigger to CSBZHK;

grant unlimited tablespace to CSBZHK;

6)创建guest用户权限


create user GUEST

  identified by guest

  default tablespace USERS

  temporary tablespace TEMP

  profile DEFAULT;

grant connect to GUEST;

grant resource to GUEST;

grant SELECT ANY DICTIONARY to GUEST; 

grant SELECT ANY TABLE to GUEST; 

grant SELECT ANY TRANSACTION to GUEST; 

grant SELECT ANY SEQUENCE to GUEST; 

7)创建表空间

CREATE TABLESPACE CSBZHK_DW DATAFILE

'/u01/app/oracle/tablespace/csbzhk/CSBZHK_DW.dbf' SIZE 1024M AUTOEXTEND ON NEXT 10M MAXSIZE 3072M

三、数据库用户操作

1、查看数据库中的所有用户

select * from all_users;

1、删除数据库用户后重建
注意:删除数据库的时候要先断开数据库的连接
将test替换成相应的用户帐号

conn / as sysdba
drop user test cascade;
create user test identified by password;
conn user/password

2、用户权限授权

进入被授权的用户执行sql语句

grant all to user  所有表的权限都授予
grant alter on T_ALARM_RECORD to qbxxgl; 授权某个表的读权限给用户
grant insert on T_ALARM_RECORD to qbxxgl;授权某个表的写权限给用户
grant update on T_ALARM_RECORD to qbxxgl;授权某个表的更新权限给用户

3、修改用户名(慎重)

注意:修改后数据库表都丢失了,需使用DBA用户登录

select user#, name from user$ where name = 'ARWEN';
update user$ set name = 'WEIWENHP' where user# = 250;

4、修改用户密码

alter user arwen(用户名) identified by abc(密码); 

5、设置用户密码永不过期

(1)dba账户登录查看dba_users,确认用户使用的porfile,一般默认是default


SELECT username,PROFILE FROM dba_users;

查找用户、用户状态、用户有效期字段

select username,account_status,expiry_date,profile from dba_users;

(2)查看有效期


SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';

(3)设置密码永不失效


ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

6、用户锁住处理

(1) conn sys/oracle as sysdba

(2)select username,account_status from dba_users where username='xxx';,查看到用户锁了

(3)解锁xxx用户,SQL> alter user xxx account unlock;

(4)查看用户限制登陆次数

  select * from dba_profiles where RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS';

(5)alter profile default limit failed_login_attempts unlimited;修改用户无论输入多少次都不会被锁定

7、用户角色信息

1)角色查询


select * from role_sys_privs where role='角色名';

2)创建角色


create role role1;

3)角色授权


grant create any table,create procedure to role1;

4) 授予角色给用户


grant role1 to user1;

5) 角色生效


set role role1

6)查看用户生效的角色


select * from SESSION_ROLES

7)修改指定用户默认角色


alter user user1 default role role1;

8)删除角色


drop role role1;  

9)查看用户角色


select * from dba_role_privs where grantee='用户名'

10)查看某个角色包括哪些系统权限


select * from dba_sys_privs where grantee='DBA'

11)查看oracle中所有的角色


select * from dba_roles;

8、DBA权限授权


grant dba  to kettle

取消DBA授权


revoke dba from kettle,dw_fjzz,testzhk,csbzhk,dw_tj,csbsys(用户名称)

四、库表数据操作

1、连接不同的用户进行查询

连接同IP数据库是zdry_hn.t_ry_jbxx(用户名.表名),非同IP需创建DBLINK,使用@数据库名连接,如:t_ry_jbxx@dids

1)创建数据库连接

跨IP数据库连接

create database link DIDS
  connect to DIDS identified by dragon
  using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
  (HOST = 192.168.2.56)(PORT = 1521)))
  (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl)))';

2)创建同义词

create or replace synonym BM_ZDRY_LXBJ  for info_henan.BM_ZDRY_LXBJ;

2、用户表结构操作

1)创建表结构

create table renyuan
(
id numeric(10),
renyuan_name varchar2(50),
zjhm  varchar2(50)
)

2)增加表字段

alter table test add name varchar2(10);

3)删除表字段

alter table T_BS_GXR(表名) drop column TASK_ID_(字段)

4)删除表结构

drop table renyuan;

5)修改表字段长度

alter table <表名> alter column <字段名> 新类型名(长度)
alter table T_BS_RK_SWRY_CSB modify ryid varchar(32);

3、用户表数据操作(增删改查)

1)插入表数据

insert into sql_test(test1,test2) values(1,11);

2)删除表数据

delete from 表名 where 条件

注意:当删除数据量比较大时,可使用truncate,如下所示:

truncate table T_ZPXX_RESULT;

删除表数据并释放表空间

truncate table  tablename DROP STORAGE;

3)更新表数据

1、编辑表数据行直接更新

update 表名set 列值1=dd,列值2=cc where 条件值

PL/SQL进入更新状态时,前面加ROWID即可直接操作,类似update的操作

SELECT T.*,ROWID FROM t_md_dataobject T WHERE T.DATAOBJECT_ID = 'VW_ZDRY_INDX_JXXX'

2、批量更新数据库中的uuid

注意:数据量大于1万时操作可能会出现无法响应,此时需要更改成其他处理方式,如ETL或者其他

begin 
    for i in 1 .. 148
    loop
        execute immediate
        'update T_GA_XZ_XZXT_ASJ set id = (lower(sys_guid())) where id is null and rownum<=5000';
       commit;
    end loop;
end;

更新语句有单引号时需要再增加单引号进行转义操作,如下:

begin 
    for i in 1 .. 5836
    loop
        execute immediate
        'update T_GA_ZA_RKXXGLXT_CZRK set rksj = to_char(sysdate,''yyyyMMddHH24miss'') where rksj is null and rownum<=10000';
        commit;
    end loop;
end;

3、更新数据来自其他表字段值

update fd_bl_bl b
   set b.gzry1_sfzh =
       (select t.username
          from T_S_BASE_USER@FDBL_SC_XN t
         WHERE t.id = b.GZRY1USERID
           ) where b.GZRY1_SFZH IS NULL and rownum <= 1

4)查询表数据

1、查询表名

select * from 表名

2、查询表数据量


select count(主键名) from user_tables;

3、查询数据库当前时间


select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;

4、查询rownum范围内的数据

select ajbh from (select a.*,rownum rc from T_GA_XZ_XZXT_ASJ a where rownum<=300000) b where rc>150000;

5、查询重复数据

select rid,count(*) from vw_fd_bl_ajryinfo_jmy group by rid having count(*)>1

6、SQL分组过滤,保证字段值不重复

select left_node_id,max(right_node_id) as right_node_id from T_GA_GX_RYXSAJ group by left_node_id

按org_id进行分组查询

select org_id,count(1) from T_S_USER_ORG group by org_id having count(1)=1

7、left join 从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行

查询出笔录关联的案件人员,并获取相关银行卡信息

select k.id,k.cjsj,k.gmsfzhm,k.hjdpcsmc,t.yhzh,t.yhmc from(select b.id,b.cjsj,r.gmsfzhm,r.hjdpcsmc from fd_bl_bl b,T_GA_ZA_RKXXGLXT_CZRK r where b.cyry1_id = r.rid and b.id not in (select bilu_id from fd_bl_goods_card) and rownum<=?1) k left join T_GA_YHZH t on t.gmsfzhm = k.gmsfzhm

8、查询日期字段范围数据

select * from T_GA_XZ_XZXT_ASJ t where rksj >= to_date(q'/2020-04-15 00:00:00/', 'yyyy-mm-dd hh24:mi:ss')
select to_char(t.lqsj,'YYYY-MM-DD HH24:MI:SS.FF3'),t.* from T_RECEIVE_LDBK010001 t
where lqsj  >= to_timestamp('2020-06-01 15:50:04.0', 'yyyy-mm-dd hh24:mi:ss.ff')

9、分页查询

SELECT * FROM (SELECT a.*,ROW_NUMBER() OVER(ORDER BY gmsfzhm,rksj) p FROM  T_GA_ZA_RKXXGLXT_CZRK a ) t WHERE t.p BETWEEN 1 AND 100

5)复制表(包括表结构和数据)

create table t_ry_zp2 as select * from t_ry_zp where sfzh='340102199412052024';

6)统计类SQL函数

1、求和函数

select sum(column_name) from table_name;
SELECT sum(高考分数) as 高考总分数 FROM [ts].[dbo].[学生表]
select SUM(SJL) from DATA_JLDPSJZK where DIC_SJFLALY='1' AND DIC_SHDW='ZNB' AND DIC_QGGSBH='35' and DIC_SJTJPL='31';

2、求某一列值的最小值

SELECT MIN(高考分数) as 高考最低分数 FROM [ts].[dbo].[学生表]

3、FIRST()返回指定字段的第一个记录的值

select fist(column_name) from table_name

4、求某一列值的最大值

select max(column_name) as 最高分 from table_name;

5、求平均值

select avg(column_name) from table_name;

6、统计字段的长度

length(字段名称)

7)常用函数

1、常用的日期函数

SYSDATE取数据库系统日期 SYSDATE+/-N 当前日期的N天 后/前 的日期 ADD_MONTHS(D,N)日期D加上N个月后的日期,N可以为负 LAST_DAY(D) 日期D所在的月的最后一天 NEXT_DAY(D,N)取得D下一个星期N的日期,N必须在1~7之间取值,且1表示星期日,2表示星期一,以此类推
例:select ADD_MONTHS(sysdate,1) from dual; 表示当前系统时间1个月后

2、转换函数

在日期和字符串之间转换 TO_CHAR(D[,’format’]):将DATE类型的D按照 format指定的格式转换为字符串 TO_DATE(S[,’format’]):将字符串S按照 format指定的格式转换为日期 如果不指定格式字符串,以系统默认的格式处理 如: Select to_char(sysdate,’YY-MM-DD HH24:MI:SS’) from dual Select to_date(‘2009-08-06’,’yyyy-mm-dd’) from dual
将varchar的日期转成所需格式:to_char(to_date(xt_zhxgsj,'yyyy-MM-dd hh24:mi:ss'),'yyyyMMddHH24MISS')
例varchar数据如下,转成20200725151702

3、字符函数

获取身份证号的前6位

select substr(sfzh,0,6) from T_TEMP_BS_RK_JNLK where sfzh='340102196509272089';  

4、取余函数mod

select mod(substr(sfzh,17,1),2) from t_zdry_idx_jxxx_bg_jl where sfzh='350782199401160058'  

5、获取最后一个逗号后面的字符串

substr(posid,instr(posid,',',-1)+1) 

五、数据库信息查询

1、查询数据库字符集

select userenv('language') from dual;

2、查看数据库的版本

select * from v$version;

3、查看数据库安装路径

echo $ORACLE_HOME

4、查看SQL执行是否走索引

PLSQL执行工具中按F5执行SQL
TABLE ACCESS FULL为全表扫描
index range scan为索引范围扫描
index unique scan


几种常见的索引类型扫描:

第一种:index unique scan

索引唯一扫描,当可以优化器发现某个查询条件可以利用到主键、唯一键、具有外键约束的列,或者只是访问其中某行索引所在的数据的时候,优化器会选择这种扫描类型。

第二种:index range scan

索引范围扫描,当优化器发现在UNIQUE列上使用了大于、小于、大于等于、小于等于以及BETWEEN等就会使用范围扫描,在组合列上只使用部分进行查询,导致查询出多行数据。对非唯一的索引列上进行任何活动都会使用index range scan。

第三种:index full scan

全索引扫描,如果要查询的数据可以全部从索引中获取,则使用全索引扫描。

第四种:index fast full scan

索引快速扫描,扫描索引中的全部的数据块,与全索引扫描的方式基本上类似。两者之间的明显的区别是,索引快速扫描对查询的数据不进行排序,数据返回的时候不是排序的。“在这种存取方法中,可以使用多块读功能,也可以使用并行读入,从而得到最大的吞吐量和缩短执行时间”。

六、Oracle更改数据文件位置

前言

在数据库运行、管理、维护维优过程中,有可能会碰到需要移动数据文件到其他硬盘或目录的情况。
删除或移动数据文件,都不像在操作系统中使用rm或cp命令那么简单。如果只是简单的rm或cp数据文件,那么数据库运行时会因为找不到正确的数据文件位置而报错。这是因为数据文件的位置和信息都被记录在控制文件中,rm或cp命令是不会也不可能更改控制文件记录的,这时必须通过alter操作去更改刷新数据库控制文件中数据文件的相关信息,以此确保数据库能够正常运行。
更改数据文件位置前,建议暂停所有针对此数据文件的数据操作。

方法一:offline表空间

适用范围:数据库处于open状态,表空间在offline的状态下才可更改。不能移动system表空间,undo表空间和temp表空间的数据文件,故此种方法更适合于做用户数据文件的迁移

1、offline表空间

alter tablespace CSBSYS_DW offline;

2、移动数据文件到新的位置

mv /u01/app/oracle/tablespace/CSBSYS/CSBSYS_DW1.dbf /u01/app/oracle/tablespace_sde/CSBSYS_SDE/
更改目录属性
chown oracle:oinstall /u01/app/oracle/tablespace_sde/CSBSYS_SDE/CSBSYS_DW1.dbf

3、rename修改表空间数据文件为新的位置,并修改控制文件

alter tablespace CSBSYS_DW rename datafile '/u01/app/oracle/tablespace/CSBSYS/CSBSYS_DW1.dbf' to '/u01/app/oracle/tablespace_sde/CSBSYS_SDE/CSBSYS_DW1.dbf';

4、online表空间

alter tablespace CSBSYS_DW online;

方法二:SQL修改数据文件位置

适用范围:可以移动任何表空间的数据文件,但其要求数据库必须处于mount状态,故此种方法更适合做整体数据库的迁移。

1、关闭数据库

shutdown immediate;

2、移动数据文件到新的位置

mv /u01/app/oracle/tablespace/CSBSYS/CSBSYS_DW1.dbf /u01/app/oracle/tablespace_sde/CSBSYS_SDE/
更改目录属性
chown oracle:oinstall /u01/app/oracle/tablespace_sde/CSBSYS_SDE/CSBSYS_DW1.dbf

3、启动数据库到mount状态

startup mount

4、通过SQL修改数据文件位置

alter database rename file '/u01/app/oracle/tablespace/CSBSYS/CSBSYS_DW1.dbf' to '/u01/app/oracle/tablespace_sde/CSBSYS_SDE/CSBSYS_DW1.dbf';

5、打开数据库

alter database open;
检查数据文件存放位置
select name from v$datafile;
select file_name,tablespace_name from dba_data_files where tablespace_name='CSBSYS_DW';

七、数据库导入导出

方法一:exp和imp(旧版本)

1、数据库导出需确保服务器端的字符集与数据库的字符集一致

修改服务器端的字符集方法:
cd ~
vi .bash_profile 按insert插入内容,增加语句
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
按esc退出,按:wq保存内容
source .bash_profile 执行生效

2、root用户创建可读写文件夹

创建文件夹datafile
mkdir /opt/datafile
设置文件夹datafile可读写
chmod 777 datafile

3、exp导出数据

切换oracle用户执行以下语句:su - oracle
exp 数据库用户名/密码@数据库名 file=文件路径 full=y
系统管理员导出多个用户数据:
nohup exp system/dragon@192.168.5.105:1521/orcl file=/opt/datafile/0126.dmp log=/opt/datafile/0126.log owner="(rygl_eeds,rygk_eeds)" &
DBA用户导出数据:nohup exp "sys/csbdb@orcl as sysdba " file=/opt/aspttybds.dmp log=/opt/aspttybds.log owner="(aspttybds)" &
导出指定表的数据:
exp username/password@服务名 tables=table1,table2 file=文件路径及文件名.dmp
exp导出条件查询的数据:
exp csbsys/dragon@192.168.0.13/orcl file = d:\m_hz_czrkjbxx.dmp tables=(m_hz_czrkjbxx) query = "where hh is not null"
导出指定表结构:
exp csbsys/dragon@192.168.0.13:1521/orcl file=d:\datadmp\csbsys_tableobject.dmp log=D:\datadmp\csbsys_tableobject.log statistics=none TABLES=(M_HZ_CZRKJBXX,M_HZ_HXX,M_WB_SWJL) rows=n
导出数据库用户的所有数据:
exp zdry_eeds/dragon@192.168.0.216/orcl file=D:\zdry_eeds.dmp log=D:\zdry_eeds.log
示例:
导出多张表:exp csbsys/Dragon#618@192.168.6.18:1521/orcl tables=JCDM_XB,JCDM_MZ,M_MH_LKCJXX file=XbMzMhdp.dmp
导出单张表:exp fdbl_sc_xn/dragon@192.168.5.247:1521/orcl tables=T_BL_BL file=tblbl.dmp

4、imp导入数据

①提前创建好要导入的数据库账号

②在本机上建立文件夹datafile并赋予读写权限

cd /opt/
mkdir datafile
chmod 777 datafile

③拷贝源数据库导出的dmp文件到目标数据库的服务器上

scp -P 22 -r root@192.168.5.107:/opt/datafile/0205.dmp /opt/datafile/

④切换至oracle用户导入数据

su - oracle
imp 数据库用户名/密码@数据库名 fromusr=来源数据库用户名 touser=导入库数据库名 file=文件路径 ignore=y
导入用户全部表
nohup imp system/dragon@192.168.5.51:1521/orcl file=/opt/datafile/0205.dmp log=/opt/datafile/0205.log fromuser="(info_henan)" touser="(info_zhaotong)" ignore=y &
导入具体表
imp fd_znbl40_zh_xn/dragon@10.201.8.123:1521/tsh1 file=/database/dmp/tblbl.dmp log=/database/dmp/tblbl.log fromuser=fdbl_sc_xn TABLES=T_BL_BL ignore=y

方法二:数据泵导入导出expdp和impdp(oracle10之后都有,效率高些)

按表导入

说明:expdp_dir指定dmp和log文件的路径,tables指定导入的表名(哪个用户哪张表)
impdp csbsys/dragon@orcl dumpfile=orcl_20200109.dmp logfile=imp_TAO.log directory=expdp_dir tables=CSBSYS.TAO

按用户导入

create or replace directory dir_dp as '/opt/datafile';
*Grant read,write on directory dir_dp to zftang;
SELECT privilege, directory_name, DIRECTORY_PATH FROM user_tab_privs t, all_directories d WHERE t.table_name(+) = d.directory_name ORDER BY 2, 1;
按表模式导出:
expdp zftang/zftang@fgisdb tables=zftang.b$i_exch_info,zftang.b$i_manhole_info dumpfile =expdp_test2.dmp logfile=expdp_test2.log directory=dir_dp job_name=my_job
按查询条件导出:
expdp zftang/zftang@fgisdb tables=zftang.b$i_exch_info dumpfile =expdp_test3.dmp logfile=expdp_test3.log directory=dir_dp job_name=my_job query='"where rownum<11"'
按表空间导出:
Expdp zftang/zftang@fgisdb dumpfile=expdp_tablespace.dmp tablespaces=GCOMM.DBF logfile=expdp_tablespace.log directory=dir_dp job_name=my_job
导出方案
expdp sys/dragon DIRECTORY=dir_dp DUMPFILE=23_120.dmp SCHEMAS=INFO_SX,QBXXGL_SHANXI_NEW,RYGL_SHANXI,RYGL_SX,SX_DP,SZXYTH_SHANXI,ZAJC_NM,ZDRY_SHANXI,ZDSJ_SHANXI,ZDS_SX
导出整个数据库:
expdp zftang/zftang@fgisdb dumpfile=full.dmp full=y logfile=full.log directory=dir_dp job_name=my_job

1、按表导入

p_street_area.dmp文件中的表,此文件是以gwm用户按schemas=gwm导出的:
impdp gwm/gwm@fgisdb dumpfile=p_street_area.dmp logfile=imp_p_street_area.log directory=dir_dp tables=p_street_area job_name=my_job

2、按用户导入(可以将用户信息直接导入,即如果用户信息不存在的情况下也可以直接导入)

impdp gwm/gwm@fgisdb schemas=gwm dumpfile =expdp_test.dmp logfile=expdp_test.log directory=dir_dp job_name=my_job

3、不通过expdp的步骤生成dmp文件而直接导入的方法:

--从源数据库中向目标数据库导入表p_street_area
impdp gwm/gwm directory=dir_dp NETWORK_LINK=igisdb tables=p_street_area logfile=p_street_area.log job_name=my_job
igisdb是目的数据库与源数据的链接名,dir_dp是目的数据库上的目录

4、更换表空间

采用remap_tablespace参数
--导出gwm用户下的所有数据
expdp system/orcl directory=data_pump_dir dumpfile=gwm.dmp SCHEMAS=gwm
注:如果是用sys用户导出的用户数据,包括用户创建、授权部分,用自身用户导出则不含这些内容
--以下是将gwm用户下的数据全部导入到表空间gcomm(原来为gmapdata表空间下)下
impdp system/orcl directory=data_pump_dir dumpfile=gwm.dmp remap_tablespace=gmapdata:gcomm

5、更换用户

impdp sys/dragon directory=dir_dp dumpfile=23_120.dmp logfile=23_120.log REMAP_SCHEMA=INFO_SX:INFO_SX,QBXXGL_SHANXI_NEW:QBXXGL_SHANXI,RYGL_SHANXI:RYGL_SHANXI,RYGL_SX:RYGL_SX,SX_DP:SX_DP,SZXYTH_SHANXI:SZXYTH_SHANXI,ZAJC_NM:ZAJC_NM,ZDRY_SHANXI:ZDRY_SHANXI,ZDSJ_SHANXI:ZDSJ_SHANXI,ZDS_SX:ZDS_SX

6、使用sys时,密码格式

expdp 'sys/oracle AS SYSDBA' schemas=system directory=DATA_PUMP_DIR dumpfile=system_%U.dmp parallel=2 job_name=jobexpdpimpdp
-- 在cmd下执行
SELECT 'exp ' || username || '/' || username || ' file=d:/' || username || '.dmp owner=' || username || ' log=d:/' ||
username || '.txt'
FROM dba_users
WHERE account_status = 'OPEN';
-- 在被导出库执行,获取语句后在导出库执行
SELECT 'create user ' || username ||' identified by ' || username || ' default tablespace ' || default_tablespace || ' temporary tablespace ' || temporary_tablespace || ';'
FROM dba_users
WHERE account_status = 'OPEN';
SELECT 'grant dba to ' || username || ';' FROM dba_users WHERE account_status = 'OPEN';
-- 在cmd下执行
SELECT 'imp ' || username || '/' || username || ' file=d:/' || username || '.dmp fromuser=' || username || ' touser=' ||
username || ' ignore=y log=d:/' || username || '_imp.txt'
FROM dba_users
WHERE account_status = 'OPEN';

导出和导入数据库版本存在差异时可修改dmp文件

示例:
sed -i '1s#11.02.00#10.02.01#' /database/dmp/tblbl.dmp

八、数据库启动关闭

1、数据库重启

su – oracle
sqlplus /nolog
connect /as sysdba
shutdown immediate 关闭
startup 启动
exit
启动监听:lsnrctl start
关闭监听:lsnrctl stop

posted on 2021-12-03 14:10  seamy  阅读(325)  评论(0编辑  收藏  举报