工作中oracle常用操作

时间:2022-11-06 20:42:18

常用数据库操作

启动数据库监听器lsnrctl start
停止数据库监听器
lsnrctl stop
登录oracle
sqlplus / as sysdba
启动oralce
startup;
关闭oracle
shutdown immediate;

数据库因数据文件损坏起不来时
startup mount
alter database datafile 21 offline drop;
alter database recover datafile '/u01/app/oracle/oradata/test.dbf';
alter database datafile '/u01/app/oracle/oradata/test.dbf' online;
alter database open;

创建表空间
CREATE TABLESPACE test
DATAFILE '/u01/app/oracle/oradata/test.dbf'
SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL;
查询表空间数据文件
SELECT tablespace_name, file_id, file_name,bytes
FROM dba_data_files ORDER BY tablespace_name;
为表空间添加数据文件
ALTER TABLESPACE test ADD DATAFILE
'/u01/app/oracle/oradata/test02.dbf' SIZE 1G
AUTOEXTEND ON NEXT 1G MAXSIZE 30G;
创建用户
create user 用户名 identified by 密码 default tablespace 表空间;
赋给用户Connect角色、Resource角色和DBA角色
grant connect,resource,dba to 用户名;
赋给用户远程权限(访问其他用户的表需要此权限)
grant all privileges to 用户名

数据库导出:
expdp 用户名/密码@数据库服务器IP:1521/数据库实例名 schemas=用户名 directory=DATA_PUMP_DIR DUMPFILE=需要导出的备份文件.DMP LOGFILE=导出产生的日志.log
导出某几个表参数
tables=schema1.table1,schema1.table2
DATA_PUMP_DIR目录是使用数据泵导出导入方式的默认存储目录,具体路径为oracle安装路径下的oracle/admin/orcl(实例)/dpdump
数据库导入:
IMPDP 用户名/密码@数据库服务器IP:1521/数据库实例名 directory=DATA_PUMP_DIR DUMPFILE=需要导入的备份文件.DMP LOGFILE=导入产生的日志.log REMAP_SCHEMA=源用户名:目标用户名 remap_tablespace=源表空间:目标表空间 TRANSFORM= OID:N,SEGMENT_ATTRIBUTES:N SKIP_UNUSABLE_INDEXES=Y TABLE_EXISTS_ACTION=truncate
表存在时参数
table_exists_action=skip
table_exists_action=replace

常用sql语句

清除表重复数据
delete from test where rowid in(
select max(rowid) From test group by year,admdivid,expfuncid,expecoid,projectid having count(*)>1)

MERGE 命令,如果数据库中存在数据就update,如果不存在就insert。
MERGE INTO TEST T1
USING (SELECT '2' as ID, 'newtest2' as NAME FROM dual) T2 on (T1.ID=T2.ID)
WHEN MATCHED THEN
UPDATE SET T1.NAME=T2.NAME
WHEN NOT MATCHED THEN
INSERT (T1.ID, T1.NAME) VALUES (T2.ID, T2.NAME );

intersect 是交集,交集就是两个结果集中都有的元素
select uid from tb1
intersect
select uid from tb2
那么既存在tb1 又存在tb2中 相同的UID 就会查出来
minus 是差集
select uid from tb1
minus
select uid from tb2
存在于tb1 但不存在于tb2中的uid 会被查出

--查看被锁的表
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
--查看那个用户那个进程照成死锁
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
--查看连接的进程
SELECT sid, serial#, username, osuser FROM v$session;
--查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
s.terminal, s.logon_time, l.type FROM v$session s, v$lock l
WHERE s.sid = l.sid AND s.username IS NOT NULL ORDER BY sid;
/*这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,
任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。*/
--杀掉进程 sid,serial#
alter system kill session'210,11562';