This is an old revision of the document!
# 启动与停止Oracle
# Oracle配置
# Oracle备份与还原
## 客户端备份与还原:使用exp与imp进行备份与还原
使用imp和exp钱,需要先执行下面的命令设置编码格式
```bash export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 ```
```bash exp <user_id>/<password> file=<file_path> #如果目标用户的默认表空间与表的默认表空间不同,imp前需要手动修改dmp文件中的表空间 #imp前先确认该用户的所有表、约束、触发器、存储过程、视图、序列等都已经删除 imp <user_id>/<password> fromuser=<origin_username> touser=<target_username> file=<dmp_file_path> ```
## 服务器端备份与还原:使用expdp和impdp进行备份与还原
# Oracle用户管理
## 新建用户
参考[How to Create a User and Grant Permissions in Oracle](https://chartio.com/resources/tutorials/how-to-create-a-user-and-grant-permissions-in-oracle/)
```sql create user <user_name> identified by <password> default tablespace <tablespace_name>; --创建新用户,并指定默认表空间(可以不指定),password含有@符号时会报错,如果希望包含@符号,不清楚如何实现 grant connect, resource, dba to <user_name>; --为用户授予权限 ```
## 删除用户
```sql drop user <user_name>; --禁止删除sys用户和system用户 ```
# Oracle表空间管理
## 新建表空间
```sql create tablespace <tablespace_name> datafile '<file_path>' size <size_in_m_or_g> autoextend on; --创建自动扩展的表空间 ```
# 命令行重启Oracle ```bash su oracle --登录 sqlplus /nolog --进入SQLPLUS ```
```sql connect / as sysdba --切换管理员登录 shutdown --关闭 startup --启动 ```
# 数据库对象解锁
```sql --数据库对象解锁 SELECT B.Owner, B.Object_Name, A.Oracle_Username, A.OS_User_Name FROM V$Locked_Object A, All_Objects B WHERE A.Object_ID = B.Object_ID;
SELECT SID, SERIAL# FROM V$SESSION WHERE SID IN (
SELECT SESSION_ID FROM DBA_DML_LOCKS WHERE NAME = '<Object_Name>'
); ALTER SYSTEM KILL SESSION '<session>, <session>'; ``` # 删除表、视图、序列等 ```sql BEGIN
FOR cur_rec IN (SELECT object_name, object_type FROM user_objects WHERE object_type IN ('TABLE', 'VIEW', 'PACKAGE', 'PROCEDURE', 'FUNCTION', 'SEQUENCE' )) LOOP BEGIN IF cur_rec.object_type = 'TABLE' THEN EXECUTE IMMEDIATE 'DROP ' || cur_rec.object_type || ' "' || cur_rec.object_name || '" CASCADE CONSTRAINTS'; ELSE EXECUTE IMMEDIATE 'DROP ' || cur_rec.object_type || ' "' || cur_rec.object_name || '"'; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line ( 'FAILED: DROP ' || cur_rec.object_type || ' "' || cur_rec.object_name || '"' ); END; END LOOP;
END; ``` # 常见Oracle管理问题 ## 没有任何数据的表格不能导出的解决办法 自Oracle11g R2开始,插入第一条数据才分配空间,所以没有数据的表默认没有分配空间,使用exp命令无法导出这些表。 解决办法是执行下面的sql得到修改表的空间分配方案的sql命令,再执行这些sql([点击查看更多信息](https://confluence.atlassian.com/kb/exporting-a-database-does-not-export-some-tables-744326156.html)): ```sql BEGIN
FOR i IN (SELECT table_name FROM user_tables WHERE segment_created = 'NO') LOOP EXECUTE IMMEDIATE 'ALTER TABLE ' || i.table_name || ' ALLOCATE EXTENT '; END LOOP;
END; ```