Oracle常用数据库操作
- 数据库备份和还原
- 备份类型: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'
--杀掉锁表进程
执行上步查询中第一列的脚本