Oracle 日常运维操作
备份
每台 Oracle 机器都已配置了每天凌晨 03:03 开始自动做备份。
[oracle@oracle-test-001:/home/oracle]
$ crontab -l
3 3 * * * sh /data/backup/backup.sh
开发童鞋若需临时备份,在 需要备份的机器上直接跑一次备份脚本即可。
备份示例:
su - oracle
sh /data/backup/backup.sh
脚本正常执行完毕后,可以到存放备份的目录下在检查一下备份文件。
备份脚本 backup.sh 示例:
$ cat /data/backup/backup.sh
#!/bin/bash
DATE=`date +%d`
echo $DATE
export ORACLE_APP=/data/app/oracle
export ORACLE_BASE=$ORACLE_APP
export ORACLE_HOME=/data/app/oracle/product/11.2.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/usr/lib:/usr/local
/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
del_date=`date -d "7 days ago" +%d`
echo $del_date
rm -f /data/backup/*$del_date.dmp
exp USER_ONE/USER_ONE
owner=USER_ONE
exp USER_TWO/USER_TWO
owner=USER_TWO
file=/data/backup/USER_ONE-$DATE.dmp
file=/data/backup/USER_TWO-$DATE.dmp
启动和关闭
启动:
su - oracle
sqlplus / as sysdba
startup
用参数文件启动 Oracle,比如:
SQL> startup
pfile='/data/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora'
关闭:
su - oracle
sqlplus / as sysdba
shutdown immediate;
启动和关闭监听(oracle 用户下执行):
lsnrctl start
lsnrctl stop
lsnrctl status
删除用户和表空间
user
drop
drop tablespace wac_tmp including contents cascade constraints;
wac_tmp CASCADE;
创建用户和表空间
创建表空间:
wac_tmp
create tablespace
datafile '/data/oradata/orcl/wac_tmp.dbf'
size 100M
reuse
autoextend on
next 100M
maxsize unlimited;
创建用户:
create user wac_tmp identified by "1" default tablespace wac_tmp;
删除用户和表空间
对于单个 user 和 tablespace 来说, 可以使用如下命令来完成。
1、删除 user :
drop user ×× cascade
说明: 删除了 user,只是删除了该 user 下的 schema objects ,是不会删除
相应的 tablespace 的。
2、 删除 tablespace
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
用户授权
-- Grant/Revoke role privileges
grant connect,resource to 用户名;
-- Grant/Revoke system privileges
grant create any sequence to 用户名;
grant select any table to 用户名;
grant update any table to 用户名;
grant unlimited tablespace to 用户名;
grant select on dba_tables to 用户名;
grant read, write on directory data_pump_dir to 用户名;
用户解锁
查看当前被锁账户及锁定时间:
select username,account_status,lock_date from dba_users;
若有业务用户被锁定,可以这样解锁:
alter user username account unlock;
用户已经被锁住了,一般是用户错误的密码尝试次数太多,我们也可以修改允许
的最大密码输入错误次数,具体修改方法如下:
1、查看当前设置值
select * from dba_profiles where RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS';
2、修改为 30 次
alter profile default limit FAILED_LOGIN_ATTEMPTS 30;
3、修改为无限次(为安全起见,不建议使用)
alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;
修改用户密码
ALTER USER user_name IDENTIFIED BY new_password;
密码过期处理
使用 sqlplus 登录管理员账户,查看指定概要文件(如 default)的密码有效期
设置为 180 天:
SQL> SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND
resource_name='PASSWORD_LIFE_TIME';
RESOURCE_NAME
RESOURCE
PROFILE
------------------------------ --------------------------------
--------
LIMIT
----------------------------------------
DEFAULT
180
PASSWORD_LIFE_TIME
PASSWORD
将密码有效期由默认的 180 天修改成无限制,执行:
alter profile default limit password_life_time unlimited;
修改之后不需要重启动数据库,会立即生效。这会让密码没有过期限制。
11g 之前的 Oracle 版本的默认 profile 是没有密码过期限制的,而在 Oracle
11g 中,默认情况下 profile 启用的密码过期时间是 180 天。若登录账号的密
码已经超过 180 天没有修改了,就会出现提示密码过期的问题,原来的账户就
不能登录到 Oracle 数据库了。
另 2 种解决办法:
1. 使用 sqlplus 登录出问题账户,会提示设置新密码,此时重新输入密码即
可,新密码可以和原来的密码相同。
2. 使用 sqlplus 登录管理员账户,执行 alter user 账户名 identified by
新密码,新密码可以和原来的密码相同。
查看锁表情况
查看锁表情况:
select t2.username,
t2.sid,t2.serial#,t2.LOCKWAIT,t2.logon_time,t3.object_name,t1.LOCKED_
MODE from v$locked_object t1, v$session t2, dba_objects t3 where
t1.session_id = t2.sid and t1.object_id = t3.object_id order by
t2.logon_time;
或
select t2.username,t2.sid,t2.serial#,t1.LOCKED_MODE,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time
/
查看锁表语句:
假设 sid 为 1306:
sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN
SELECT
(SELECT DECODE(sql_hash_value, 0, prev_hash_value,
sql_hash_value),DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b WHERE b.sid = '1306')
ORDER BY piece ASC;
查出原因后,解除数据库中被锁住的表(SID,SERIAL):
SID=39,SERIAL=1390
alter system kill session '39,1390’;
查看连接数
select * from v$session where username is not null
select username,count(username) from v$session where username is not null
group by username
查看不同用户的连接数:
select count(*) from v$session
并发连接数:
Select count(*) from v$session where status='ACTIVE'
查看大表有哪些
账户隔离,先切换到用户下,然后查看。
比如:查看 zilingzhi 用户下大于 10000 行的表
SQL> conn
SQL> select table_name,num_rows from user_tables where num_rows>10000;
zilingzhi/zilingzhi
以此类推。
查看表属于哪个用户
select owner from dba_tables where table_name=upper('表名');
这个要求当前登录的用户权限为 dba 或有查询这个视图的权限才行。
栗子:
SQL> select owner from dba_tables where
table_name=upper('G_USERDATA_HISTORY');
OWNER
------------------------------
GENE_ICON2
GENE_ICON1
查看表结构
desc table_name
SQL> SET LONG 9999
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','table_name') FROM DUAL;
查看字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
修改字符集
比如,将数据库的字符集修改为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
1、关闭数据库,修改 oracle 用户的环境变量
shutdown immediate
vim
/home/oracle/.bash_profile
将
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
修改为:
export NLS_LANG="Simplified Chinese_china”.ZHS16GBK
2、让修改的参数生效
source /home/oracle/.bash_profile
3、启动数据库
su - oracle
sqlplus / as sysdba
startup
查看表结构及大小
查看表结构:
desc tablename;
查看表大小(M):
select segment_name,bytes/1024/1024 from dba_segments where
segment_name
in('G_USERDATA_HISTORY','G_AGENT_STATE_HISTORY','G_CALL_HISTORY','G_I
R_HISTORY','G_PARTY_HISTORY');
truncate 表操作
conn usr_tmp1/usr_tmp1
truncate table
usr_tmp1.USERDATA_HISTORY;
查看用户权限
查看用户或角色系统权限(直接赋值给用户或角色的系统权限):
select * from dba_sys_privs;
select * from user_sys_privs;
查看角色(只能查看登陆用户拥有的角色)所包含的权限:
select * from role_sys_privs;
查看一个用户的所有系统权限(包含角色的系统权限):
select privilege from dba_sys_privs where grantee='DATAUSER'
union
select privilege from dba_sys_privs where grantee in (select granted_role
from dba_role_privs where grantee='DATAUSER' );
导入和导出
通过 exp 和 imp 导出导入:
exp(导出 dmp):
exp TMP_USER/1
file=/data/backup/TMP_USER-$DATE.dmp owner=TMP_USER
imp(导入 dmp):
file=/data/backup/TMP_USER-26.dmp
imp TMP_USER/1
EXP 有三种主要的方式(完全、用户、表)
A、完全:EXP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y 如果
要执行完全导出,必须具有特殊的权限
B、用户模式:EXP SONIC/SONIC
OWNER=SONIC 这样用户 SONIC 的所有对象被输出到文件中。
BUFFER=64000 FILE=C:\SONIC.DMP