ORACLE冷备份及恢复

备份

直接拷贝oracle目录下的adminoradata(datafile controlfileredo)flash_recovery_area三个文件夹,db_1目录下database(PWDfilepfile)dbs(spfile)NETWORK/ADMIN(listener.oratnsnames.ora),到其他存储实现备份。

恢复

方法一:最简单的方法(需建库)

1.创建一个和原来一样的数据库。(安装路径和数据库名必须和原来一致)
2.
停止数据库 shutdown immediate
3. 
复制安装目录下的adminoradataflash_recovery_area覆盖,复制database(PWDfilepfile) 覆盖
4. 
启动数据库 startup;

方法二:(不需建库,稍麻烦点)

(1):操作系统重装,如果做冷备恢复,要保证相同操作系统,相同的数据库版本。
(2)
:正常安装oracle软件,只需要安装软件,不用建实例。
(3)
:数据覆盖,包括数据文件、参数文件、控制文件、日志文件、pwd文件,放在与原系统相同的目录。如果目录有所改变,则需要另外建立控制文件,修改pfile 
(4)
:建立服务:使用oradim 命令 cmd oradim -new -sid gbicc ,表示建立一个服务,sidgbicc。如果是在linux下,不需要此步。 
(5)
:建立监听: net configuration assintant 来建立(建议将源系统的network下的文件拷过来,根据实际情况修改) 
(6)
:打开数据库: cmd
set oracle_sid=gbicc; 
sqlplus /nolog; 
Conn / as sysdba;
startup;

至此,冷备份恢复成功。


5.1 创建数据文件大小20M的表空间

> CREATE TABLESPACE usertbs1 datafile 
'D:\tmp\usertbs1.DBF' SIZE 20M;


5.2 区定制分配
> CREATE TABLESPACE usertbs1 datafile 
'D:\tmp\usertbs1.DBF' SIZE 20M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 512K;


5.3 每次自动扩展1M,最大值为100MB
> ALTER DATABASE DATAFILE 
'D:\tmp\usertbs1.DBF' 
AUTOEXTEND ON NEXT 1M MAXSIZE 100M;


5.4 创建临时表空间
> CREATE TEMPORARY TABLESPACE temptbs TEMPFILE
'D:\tmp\temptbs.DBF' SIZE 20M
EXTEND MANAGEMENT LOCAL UNIFORM SIZE 10M;
 /*设置当前默认表空间*/
> ALTER DATABASE DEFAULT TABLESPACE temptbs;


5.5 对表空间联机脱机
> ALTER TABLESPACE usertbs1 OFFLINE;
> ALTER TABLESPACE usertbs1 ONLINE;


5.9 为表空间添加数据文件
> ALTER TABLESPACE usertbs1 ADD DATAFILE
'D:\tmp\USERS05.DBF' SIZE 50M;


10题与9题一样


5.12 数据文件更名
> ALTER TABLESPACE usertbs1 OFFLINE;
手动改数据文件名为 USERS005.DBFs
> ALTER TABLESPACE usertbs1 RENAME DATAFILE
'D:\tmp\USERS05.DBF' TO 
'D:\tmp\USERS005.DBF';
> ALTER TABLESPACE usertbs1 ONLINE;


5.14 添加重做日志组,包含redo5a.log和redo5b.log,大小为5MB
> ALTER DATABASE ADD LOGFILE GROUP 4
('D:\tmp\redo5a.log', 'D:\tmp\redo5b.log')
SIZE 5M;


5.15 添加日志文件成员
> ALTER DATABASE ADD LOGFILE MEMBER
'D:\tmp\redo5c.log' TO GROUP 4;


5.16 切换归档模式且自动归档
> SHUTDOWN IMMEDIATE
> STARTUP MOUNT
> ALTER DATABASE ARCHIVELOG
> ALTER DATABASE OPEN


5.17 设置数据库归档路径
> ALTER SYSTEM SET db_recovery_file_dest="D:\ORACLE\BACKUP";
6`1
6.2 建表
> CREATE TABLE exer_class(
    CNO NUMBER(2) PRIMARY KEY,
    CNAME VARCHAR(20),
    NUM NUMBER(3)
);
> CREATE TABLE exer_studnet(
    SNO NUMBER(4) PRIMARY KEY,
    SNAME VARCHAR(10) UNIQUE,
    SAGE NUMBER,
    SEX CHAR(2),
    CNO NUMBER(2)
);


6.3 添加检查约束
> ALTER TABLE exer_studnet ADD 
CONSTRAINT S_CK CHECK (SAGE BETWEEN 0 AND 100);


6.4 取值为M或F,默认M
> ALTER TABLE exer_studnet ADD 
CONSTRAINT SEX_CK CHECK(SEX IN ('M','F'));
> ALTER TABLE exer_studnet MODIFY SEX DEFAULT 'M';


6.5 建立唯一索引
> CREATE UNIQUE INDEX class_name_index ON exer_class(CNAME);


6.6 创建视图
> CREATE VIEW cl_stu_view as 
SELECT c.CNO, c.CNAME, s.SNO, s.SNAME FROM exer_class c, exer_studnet s 
WHERE s.CNO=c.CNO;


6.7 创建序列
> CREATE SEQUENCE no_seq START WITH 100000001 INCREMENT BY 1 NOCACHE NOCYCLE;


6.8 表格分区
> CREATE TABLESPACE EXAMPLE DATAFILE
'D:\tmp\EXAMPLE.DBF' SIZE 50M;
> CREATE TABLESPACE ORCLTBS1 DATAFILE
'D:\tmp\ORCLTBS1.DBF' SIZE 50M;
> CREATE TABLESPACE ORCLTBS2 DATAFILE
'D:\tmp\ORCLTBS2.DBF' SIZE 50M;


> CREATE TABLE exer_student_range(
    SNO NUMBER(4) PRIMARY KEY,
    SNAME VARCHAR(10) UNIQUE,
    SAGE NUMBER,
    SEX CHAR(2),
    CNO NUMBER(2)
)
PARTITION BY RANGE(SAGE)(
    PARTITION P1 VALUES LESS THAN (20) TABLESPACE EXAMPLE,
    PARTITION P2 VALUES LESS THAN (30) TABLESPACE ORCLTBS1,
    PARTITION P3 VALUES LESS THAN (MAXVALUE) TABLESPACE ORCLTBS2
);


6.9 按性别分区
> CREATE TABLE exer_student_list(
    SNO NUMBER(4) PRIMARY KEY,
    SNAME VARCHAR(10) UNIQUE,
    SAGE NUMBER,
    SEX CHAR(2),
    CNO NUMBER(2)
)
PARTITION BY LIST(SEX)(
    PARTITION male VALUES('M') TABLESPACE ORCLTBS1,
    PARTITION female VALUES('F') TABLESPACE ORCLTBS2
);


6.10 本地分区索引
> CREATE INDEX student_local ON exer_student_range(SAGE) LOCAL;
9.1 输出所有员工
> SET SERVEROUTPUT ON;
> DECLARE
    CURSOR cursor_emp IS 
    SELECT ENAME, EMPNO, SAL, DEPTNO from emp;
BEGIN
    FOR emp_record IN cursor_emp
  LOOP
    EXIT WHEN cursor_emp%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(emp_record.ENAME||' '||emp_record.EMPNO
    ||' '||emp_record.SAL||' '||emp_record.DEPTNO);
  END LOOP;
END;
/  


9.2 输出比平均工资高的员工
> SET SERVEROUTPUT ON;
> DECLARE
    CURSOR cursor_emp IS 
    SELECT ENAME, EMPNO, SAL, DEPTNO FROM EMP 
    WHERE SAL>(SELECT AVG(SAL) FROM EMP);
BEGIN
    FOR emp_record IN cursor_emp
  LOOP
    EXIT WHEN cursor_emp%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(emp_record.ENAME||' '||emp_record.EMPNO
    ||' '||emp_record.SAL||' '||emp_record.DEPTNO);
  END LOOP;
END;
/  


9.3 输出员工及部门名
> SET SERVEROUTPUT ON;
> DECLARE
    CURSOR cursor_emp IS 
    SELECT ENAME, EMPNO, SAL, d.DNAME FROM EMP e,  DEPT d
    WHERE e.DEPTNO=d.DEPTNO;
BEGIN
    FOR emp_record IN cursor_emp
  LOOP
    EXIT WHEN cursor_emp%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(emp_record.ENAME||' '||emp_record.EMPNO
    ||' '||emp_record.SAL||' '||emp_record.DNAME);
  END LOOP;
END;
/


9.4 查找员工
> SET SERVEROUTPUT ON;
> DECLARE
    emp_record EMP%ROWTYPE;
BEGIN
    SELECT * INTO emp_record FROM EMP where ENAME='Smith'; 
    DBMS_OUTPUT.PUT_LINE(emp_record.ENAME||' '||emp_record.EMPNO
        ||' '||emp_record.SAL||' '||emp_record.HIREDATE||' '||emp_record.DEPTNO);
EXCEPTION 
    WHEN NO_DATA_FOUND THEN
    INSERT INTO EMP(EMPNO, ENAME, JOB, SAL, HIREDATE, DEPTNO) VALUES
    (210, 'Smith', 'AD_VP', 7500, to_date ( '2000-10-05' , 'YYYY-MM-DD' ), 20);
    WHEN TOO_MANY_ROWS THEN
    FOR v_emp IN (SELECT * INTO emp_record FROM EMP where ENAME='Smith')
    LOOP
        DBMS_OUTPUT.PUT_LINE(v_emp.ENAME||' '||v_emp.EMPNO
        ||' '||v_emp.SAL||' '||v_emp.HIREDATE||' '||v_emp.DEPTNO);
  END LOOP;
END;
/


10.1 创建存储过程
CREATE OR REPLACE PROCEDURE outSal(
  id EMP.EMPNO%TYPE)
AS
salary EMP.SAL%TYPE;
BEGIN
  SELECT SAL INTO salary FROM EMP WHERE EMP.EMPNO=id;
  DBMS_OUTPUT.PUT_LINE(salary);
EXCEPTION 
  WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.PUT_LINE('对不起,没有此员工!');
END outSal;
/
> call outSal(210);


10.2 加工资
CREATE OR REPLACE PROCEDURE increaSal(
  id EMP.EMPNO%TYPE)
AS
  emp_increment NUMBER;
  emp_dept EMP.DEPTNO%TYPE;
BEGIN
  SELECT DEPTNO INTO emp_dept FROM EMP WHERE EMP.EMPNO=id;

  IF emp_dept=10 THEN emp_increment := 140;
  ELSIF emp_dept=20 THEN emp_increment := 200;
  ELSIF emp_dept=30 THEN emp_increment := 250;
  ELSE emp_increment := 300;
  END IF;


  UPDATE emp SET sal = sal + emp_increment
  WHERE EMP.EMPNO=id;
END;
/
> call increaSal(210);


10.5 创建包,包含函数和过程
> CREATE OR REPLACE PACKAGE mypkg IS
  FUNCTION maxSal(dno EMP.DEPTNO%TYPE) return EMP.SAL%TYPE; 
  PROCEDURE staff(dno EMP.DEPTNO%TYPE);
END mypkg;
/


> CREATE OR REPLACE PACKAGE BODY mypkg IS
    FUNCTION maxSal(dno EMP.DEPTNO%TYPE) 
    return EMP.SAL%TYPE IS
  max_sal EMP.SAL%TYPE;
  BEGIN
    SELECT MAX(SAL) INTO max_sal
    FROM  EMP where DEPTNO=dno;
    RETURN max_sal;
  END maxSal;
  
  PROCEDURE staff(dno EMP.DEPTNO%TYPE) IS
    CURSOR cursor_emp IS  
    SELECT EMPNO, ENAME FROM (SELECT EMPNO, ENAME, SAL FROM EMP WHERE DEPTNO=dno) 
    where SAL=maxSal(dno);
  BEGIN
    FOR emp_record IN cursor_emp
    loop  
        dbms_output.put_line('No:'||emp_record.EMPNO||' Name:'||emp_record.ENAME);
    end loop;
  END staff;
END mypkg;
/
> EXECUTE  MyPKG.maxSal(20); 
> EXECUTE  MyPKG.staff(20); 


10.6 包含过程和鼠标
> CREATE OR REPLACE PACKAGE mypkg IS
    CURSOR cursor_emp IS SELECT * FROM EMP;
    PROCEDURE staff;
END mypkg;
/
> CREATE OR REPLACE PACKAGE BODY mypkg IS  
  PROCEDURE staff IS
  BEGIN
    FOR emp_record IN cursor_emp
    loop  
        EXIT WHEN cursor_emp%ROWCOUNT>5 or cursor_emp%NOTFOUND;
        dbms_output.put_line('No:'||emp_record.EMPNO||' Name:'||emp_record.ENAME);
    end loop;
  END staff;
END mypkg;
/
> EXECUTE  MyPKG.staff; 


10.7 创建触发器
> CREATE OR REPLACE TRIGGER trg_secure_emp
    BEFORE INSERT OR UPDATE OR DELETE ON EMP
BEGIN
    IF TO_CHAR(SYSDATE, 'HH24:MI') NOT BETWEEN '08:00' AND '17:00'
    THEN
        RAISE_APPLICATION_ERROR (-20005, 'You can only change table in normal time.');
    END IF;
END trg_secure_emp;
/


10.8 触发事件,统计
> CREATE OR REPLACE TRIGGER trg_secure_emp
    AFTER INSERT OR UPDATE OR DELETE ON EMP
DECLARE
    v_count NUMBER;
    v_sal NUMBER(7,2);
BEGIN
    SELECT COUNT(DISTINCT EMPNO), AVG(SAL) INTO v_count, v_sal FROM EMP;
    dbms_output.put_line('Count:'|| v_count||' AvgSal:'||v_sal);
END trg_secure_emp;
/


13.1 创建用户
> CREATE USER GRANT SELECT, UPDATE ON SCOTT.EMP TO usera_exer WITH GRANT OPTION; IDENTIFIED BY usera
DEFAULT TABLESPACE USERS QUOTA 10M ON USERS
ACCOUNT LOCK;  


13.2
> CREATE USER userb_exer IDENTIFIED BY userb
DEFAULT TABLESPACE USERS QUOTA 10M ON USERS;  


13.3 赋权
> GRANT CREATE SESSION TO usera_exer WITH ADMIN OPTION;
> GRANT SELECT, UPDATE ON SCOTT.EMP TO usera_exer WITH GRANT OPTION;


13.4 解锁
> ALTER USER usera_exer ACCOUNT UNLOCK;


13.5 登录修改赋权
> GRANT SELECT, UPDATE ON SCOTT.EMP TO userb_exer WITH GRANT OPTION;


13.6 禁止授权
> REVOKE CREATE SESSION FROM usera_exer;
> GRANT CREATE SESSION TO usera_exer;


13.7 回收
> REVOKE SELECT, UPDATE ON SCOTT.EMP FROM usera_exer;
> GRANT SELECT, UPDATE ON SCOTT.EMP TO userb_exer;


13.8 创建角色
>  CREATE ROLE rola;
>  CREATE ROLE rolb;
> GRANT CREATE TABLE TO rola;
> GRANT INSERT, DELETE ON SCOTT.EMP TO rola;
> GRANT CONNECT, RESOURCE TO rolb;


13.9 授予角色
> GRANT rola TO usera_exer;


13.10 创建概要文件
> CREATE PROFILE usera_profile LIMIT
CONNECT_TIME 30 
IDLE_TIME 10 
PASSWORD_LIFE_TIME 20
FAILED_LOGIN_ATTEMPTS 4 
PASSWORD_LOCK_TIME 10; 


> ALTER USER usera_exer PROFILE usera_profile;


14.1 冷备份
> SELECT file_name FROM dba_data_files;
> SELECT member FROM v$logfile;
> SELECT value FROM v$parameter WHERE name='control_files';
> SHUTDOWN IMMEDIATE;
 /*手动复制粘贴文件*/
> STARTUP


14.2 热备份
/*开启归档模式*/
> SHUTDOWN IMMEDIATE
> STARTUP MOUNT
> ALTER DATABASE ARCHIVELOG;
> ALTER DATABASE OPEN;
> SELECT tablespace_name, file_name FROM dba_data_files ORDER BY tablespace_name;
> ALTER TABLESPACE USERS BEGIN BACKUP;
 /*手动复制粘贴文件*/
> ALTER TABLESPACE USERS END BACKUP;
 /*对其余的表空间进行相同操作*/
> ALTER DATABASE BACKUP CONTROLFILE  TO 'D:\tmp\CONTROL.CTL'
> ALTER SYSTEM ARCHIVE LOG CURRENT;
> ALTER SYSTEM SWITCH LOGFILE;
 /*手动复制粘贴归档日志文件和初始化参数文件
    归档日志文件位置:
    show parameter db_recovery_file_dest;
    初始化参数文件位置:
    SELECT NAME, VALUE FROM V$parameter WHERE NAME='spfile';
    */
14.3
/*参考以上操作*/


14.4 热备份恢复
> SHUTDOWN IMMEDIATE
> STARTUP MOUNT
> ALTER DATABASE ARCHIVELOG;
> ALTER DATABASE DATAFILE 'D:\APP\JUNF\ORADATA\ORCL\USERS01.DBF' OFFLINE;
/*复制粘贴DBF文件*/
> RECOVER DATAFILE 'D:\APP\JUNF\ORADATA\ORCL\USERS01.DBF';
> ALTER DATABASE DATAFILE 'D:\APP\JUNF\ORADATA\ORCL\USERS01.DBF' ONLINE;


14.8 EXPDP 
 /*手动本地建立目录tmp*/
> CREATE OR REPLACE DIRECTORY dumpdir AS 'D:\tmp';
> GRANT READ, WRITE ON DIRECTORY dumpdir TO SCOTT;
 /*在cmd敲
 expdp scott/scott DIRECTORY=dumpdir DUMPFILE=scott.dmp SCHEMAS=scott
 */


15.4
> set time on
/*直接照打*/


15.5 闪回查询
> set time on
>select * from exercise as of 
timestamp to_timestamp('2018-6-6 15:40:10', 'YYYY-MM-DD HH24:MI:SS');


15.6 闪回版本查询
> set time on
> SELECT versions_xid XID, versions_starttime STARTTIME, versions_endtime ENDTIME, versions_operation OPERATION, 
sno, sname FROM exercise VERSIONS BETWEEN TIMESTAMP 
to_timestamp('2018-6-17 15:35:10', 'YYYY-MM-DD HH24:MI:SS')
AND 
to_timestamp('2018-6-16 15:42:10', 'YYYY-MM-DD HH24:MI:SS')
WHERE sno=100 ORDER BY STARTTIME;


15.7 闪回表
> set time on
> ALTER TABLE exercise ENABLE ROW MOVEMENT;
> FLASHBACK TABLE exercise TO TIMESTAMP to_timestamp('2018-6-16 15:40:10', 'YYYY-MM-DD HH24:MI:SS');


15.8 闪回删除
> ALTER SYSTEM SET RECYCLEBIN=ON;
> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE FROM USER_RECYCLEBIN;
> FLASHBACK TABLE exercise TO BEFORE DROP;


15.9 闪回日志
> ALTER SYSTEM SET db_flashback_retention_target=4320;


15.10 闪回数据库
 /*开启归档模式*/
> SHUTDOWN IMMEDIATE
> STARTUP MOUNT
> ALTER DATABASE FLASHBACK ON;
> ALTER DATABASE OPEN;
> set time on
 /*以上操作都得在表操作之前*/
> SHUTDOWN IMMEDIATE
> STARTUP MOUNT EXCLUSIVE
> FLASHBACK DATABASE TO TIMESTAMP (to_timestamp('2018-6-16 15:30:00', 'YYYY-MM-DD HH24:MI:SS'));
> ALTER DATABASE OPEN RESETLOGS;




猜你喜欢

转载自blog.csdn.net/qq_17358703/article/details/80729051