Oracle常用数据库操作

  1. 数据库备份和还原
  • 备份类型:Oracle数据库备份可以分为物理备份和逻辑备份两种类型。物理备份是指备份数据库文件,包括数据文件、控制文件、日志文件等,可以恢复整个数据库。逻辑备份是指备份数据库中的逻辑数据,如表、视图、存储过程等,可以恢复数据库中的数据。
  • 备份工具:Oracle提供了多种备份工具,如RMAN、EXP/IMP、Data Pump等。其中,RMAN是Oracle的官方备份工具,可以进行物理备份和恢复,具有很高的可靠性和灵活性。

  • 逻辑备份之EXP/IMP

    • EXP和IMP是客户端工具,既可以在客户端使用,也可以在服务端使用。
    • 对于10g以上的服务器,使用exp通常不能导出0行数据的空表,而此时必须使用expdp导出。
    #将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中 
    exp system/manager@TEST   rows=y  indexes=y compress=n buffer=65536   feedback=100000 full=y  file=d:\daochu.dmp  log=d:\daochulog.txt owner=(ECC_BIZ,ECC_CUSTOMER)
    #将D:\daochu.dmp 中的数据导入 TEST数据库中
    imp system/manager@TEST  ignore=y  full=y   file=d:\daochu.dmp  log=d:\daoru.txt
    
  • 逻辑备份之EXPDP/IMPDP

    • EXPDP和IMPDP是服务端的工具,只能在服务端使用,不能在客户端使用。
    #查询表空间名
    select default_tablespace from dba_users where  username='TEST';
    #清空回收站
    purge tablespace DB_TEST 或 purge tablespace  DB_TEST user TEST;
    #schemas按用户导出
    expdp A/passwd@orcl directory=data_dir schemas=DB_TEST dumpfile=expdp.dmp  logfile=expdp.log cluster=no EXCLUDE=STATISTICS version=11.2.0.4
    #按表空间导出
    expdp sys/passwd@orcl tablespace=tbs1,tbs2 dumpfile=expdp.dmp directory=data_dir logfile=expdp.log
    
    #同名用户导入,从用户A导入到用户A;
    impdp A/passwd@orcl directory=data_dir schemas=DB_TEST dumpfile=expdp.dmp logfile=impdp.log version=11.2.0.4
    #导入表空间
    impdp sys/passwd tablespaces=tbs1 directory=data_dir dumpfile=expdp.dmp logfile=impdp.log
    

2.数据库回滚

--查 n/24  n个小时前的数据 看数据库中保留多久的数据了 几个小时内的没问题,对比记录数目可知数据差异
select count(*) from ekko as of timestamp sysdate - 2/24
--实现回滚
insert into ekko select count(*) from ekko as of timestamp sysdate - 2/24
--数据误修改还原
create table test_bak as select * from test as of timestamp TO_TIMESTAMP('2023-12-21 09:36:49', 'YYYY-MM-DD HH24:MI:SS');
update test a set a.xxx=(select b.xxxfrom test_bak b where a.id=b.id) where a.xxx='条件';

3.查询数据库执行记录

--首先查找表的操作记录
SELECT
	sql_text,
	last_active_time,
	sql_id
FROM
	v$sqlarea t
WHERE
	t.FIRST_LOAD_TIME >= '2024-03-30/00:00:00'
	AND t.FIRST_LOAD_TIME <= '2024-04-01/15:00:00'
	AND SQL_TEXT LIKE 'DELETE FROM TEST%'
ORDER BY
	t.FIRST_LOAD_TIME DESC
--从上面的记录中找到最新的sql操作记录sql_id,然后找到用户名和主机
SELECT
	--客户端操作系统的用户名
	osuser,
	--客户端运行的终端名
	TERMINAL,
	--客户端的机器名
	MACHINE,
	--客户端执行的程序名
	PROGRAM,
	USERNAME,
	LAST_ACTIVE_TIME
FROM
	sys.v_$session l,
	sys.v_$sql s
WHERE
	s.SQL_ID = 'dfut13bt3rf20'
	AND l.USERNAME = '用户名'
ORDER BY
	LAST_ACTIVE_TIME;

4.抓取数据库在执行SQL

SELECT B.SID          ORACLEID,
       B.USERNAME     登录ORACLE用户名,
       B.SID,
       B.SERIAL#,
       PADDR,
       C.SQL_TEXT     正在执行的SQL,
       C.SQL_FULLTEXT,
       B.MACHINE      计算机名
  FROM V$PROCESS A, V$SESSION B, V$SQLAREA C
WHERE A.ADDR = B.PADDR
   AND B.SQL_HASH_VALUE = C.HASH_VALUE
   AND B.USERNAME = 'GXNTJT'
ORDER BY c.SQL_TEXT;

5.锁表查询和解锁方法

--锁表查询
SELECT
  'alter system kill session ''' || C.SID || ',' || C.SERIAL# || ',@' ||C.INST_ID || ''' immediate;' AS kill_session_scripts,
  B.OWNER, --所属用户											 
  B.OBJECT_NAME, --名称	                   
  A.XIDUSN,  
  A.XIDSLOT,  
  A.XIDSQN,
  A.SESSION_ID,--锁表用户的session
  A.ORACLE_USERNAME,--锁表用户的Oracle用户名
  A.OS_USER_NAME, --锁表用户的操作系统登陆用户名                  
  A.PROCESS,  
  A.LOCKED_MODE,
  C.MACHINE,--锁表用户的计算机名称										
  C.STATUS,  --锁表状态                  
  C.SERVER,
  C.SID,
  C.SERIAL#,
  C.PROGRAM, --锁表用户所用的数据库管理工具
	D.SQL_TEXT
FROM
  --表的DML锁,DDL锁用dba_ddl_locks视图
  GV$LOCKED_OBJECT A
  --数据库对象信息
  INNER JOIN DBA_OBJECTS B ON A.OBJECT_ID = B.OBJECT_ID
  --会话信息
  INNER JOIN SYS.GV_$SESSION C ON A.PROCESS = C.PROCESS AND A.SESSION_ID = C.SID AND A.INST_ID = C.INST_ID
  --当前查询过的sql语句访问过的资源及相关的信息
  INNER JOIN GV$SQLAREA D ON C.SQL_ID = D.SQL_ID
WHERE 1 = 1
--AND D.SQL_TEXT LIKE '%TEST%';
--AND C.STATUS='ACTIVE'

--杀掉锁表进程
执行上步查询中第一列的脚本
posted @ 2023-12-03 23:01  丁生·  阅读(8)  评论(0编辑  收藏  举报