引言:在數據庫平常維護中,咱們常常須要不按期或者按期從生產數據庫備份數據恢復到開發或者測試服務器,通常的處理是編寫好對應的腳本文件,而後手工或者自動調度執行。可是在調用腳本的過程當中,咱們常常會遇到一些特殊狀況,好比有用戶正在使用或者鏈接,這樣就會致使腳本執行的錯誤,這個彙總的腳本包含了對這種狀況的通用處理方法,本腳本包含oracle和sqlserver的處理腳本,基本實現了現有經常使用數據庫的每日構建工做,但願對一些剛接觸DBA工做的人有一些指導建議,雖然網上有一些零星的腳本,可是尚未發現有這麼仔細和所有的內容,所以有必要共享出來。sql
說明:shell
oracle和sql的雙庫備份恢復
oracle:192.168.200.17 的CAS HRM ARM用戶恢復到192.168.201.12
sql:192.168.200.117的ekp2和bfclogin庫恢復到192.168.201.14數據庫
工做原理:windows
oracle的工做原理:經過expdp導出用戶數據而後scp到開發服務器而後impdp導入數據,前提是腳本刪除用戶和庫,重建後導入bash
sql工做原理:backup庫後經過ftp傳輸到開發服務器,而後restore庫後,處理孤立帳戶問題。服務器
二者都處理了kill鏈接用戶的問題。session
1、oracle庫恢復
1.主庫192.168.200.17設置:設置爲天天晚上2點執行
vi /home/oracle/sysback.shoracle
1 #!/bin/bash 2 rm -f /opt/arm.dmp 3 rm -f /opt/hrm.dmp 4 rm -f /opt/cas.dmp 5 su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/expdp system/s777a888 DIRECTORY=dump_dir DUMPFILE=arm.dmp SCHEMAS=ARM PARALLEL=2" 6 su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/expdp system/s777a888 DIRECTORY=dump_dir DUMPFILE=hrm.dmp SCHEMAS=HRM PARALLEL=2" 7 su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/expdp system/s777a888 DIRECTORY=dump_dir DUMPFILE=cas.dmp SCHEMAS=CAS PARALLEL=2" 8 9 scp /opt/arm.dmp root@192.168.201.12:/home/impscript/ 10 scp /opt/hrm.dmp root@192.168.201.12:/home/impscript/ 11 scp /opt/cas.dmp root@192.168.201.12:/home/impscript/
2.從庫192.168.201.12 設置:天天3點執行app
(1)首先建立刪除鏈接用戶的存儲過程ide
1 create or replace procedure "SYS"."DROP3USER" 2 as 3 begin 4 declare 5 cursor cur_user 6 is 7 SELECT SID,SERIAL# SERIAL FROM V$SESSION p WHERE USERNAME in ('ARM','CAS','HRM') and status='INACTIVE'; 8 row_user cur_user%rowtype; 9 USID V$SESSION.SID%TYPE; 10 SERIAL V$SESSION.SERIAL#%TYPE; 11 begin 12 for row_user in cur_user loop 13 USID:=row_user.SID; 14 SERIAL:=row_user.SERIAL; 15 execute immediate 'ALTER SYSTEM KILL SESSION '''|| USID || ',' || SERIAL || ''''; 16 end loop; 17 end; 18 19 end; 20 /
GRANT EXECUTE ON "SYS"."DROP3USER" TO "DBA";
(2)建立導入腳本
vi /home/impscript/imp.sh
1 #!/bin/bash 2 rm -f /home/impscript/cas.log 3 rm -f /home/impscript/hrm.log 4 rm -f /home/impscript/arm.log 5 chmod -R 777 /home/impscript/cas.dmp 6 chmod -R 777 /home/impscript/hrm.dmp 7 chmod -R 777 /home/impscript/arm.dmp 8 9 su - oracle -c "/u01/app/product/11.2/bin/sqlplus /nolog" <<EOF 10 connect / as sysdba 11 exec SYS.DROP3USER; 12 drop user ARM cascade; 13 drop user CAS cascade; 14 drop user HRM cascade; 15 drop tablespace BFGDATA including contents and datafiles; 16 create tablespace BFGDATA logging datafile '/u01/app/oradata/orcl/bfgdata01.dbf' size 200m autoextend on next 50m maxsize 20480m extent management local; 17 create user ARM identified by ARM default tablespace BFGDATA; 18 create user CAS identified by CAS default tablespace BFGDATA; 19 create user HRM identified by HRM default tablespace BFGDATA; 20 grant connect,resource,dba to ARM; 21 grant connect,resource,dba to CAS; 22 grant connect,resource,dba to HRM; 23 grant read,write on directory dump_dir to system; 24 exit 25 EOF 26 su - oracle -c "impdp system/orcl_2014@orcl DIRECTORY=dump_dir DUMPFILE=cas.dmp SCHEMAS=CAS logfile=cas.log PARALLEL=2" 27 su - oracle -c "impdp system/orcl_2014@orcl DIRECTORY=dump_dir DUMPFILE=hrm.dmp SCHEMAS=HRM logfile=hrm.log PARALLEL=2" 28 su - oracle -c "impdp system/orcl_2014@orcl DIRECTORY=dump_dir DUMPFILE=arm.dmp SCHEMAS=ARM logfile=arm.log PARALLEL=2" 29 rm -f /home/impscript/cas.dmp 30 rm -f /home/impscript/hrm.dmp 31 rm -f /home/impscript/arm.dmp
2、sqlserver設置
1.主庫192.168.200.117 設置:設置天天2點執行
master庫下創建存儲過程dbfortransfer
CREATE proc dbfortransfer as declare @sql varchar(2000),@bkfile varchar(200) begin set @bkfile='D:\DB_BAK\transfer\ekp2.bak' set @sql='master..xp_cmdshell ''del "'+@bkfile+'"'',No_output' exec(@sql) set @bkfile='D:\DB_BAK\transfer\BFCLogin.bak' set @sql='master..xp_cmdshell ''del "'+@bkfile+'"'',No_output' exec(@sql) BACKUP DATABASE EKP2 TO DISK = 'D:\DB_BAK\transfer\ekp2.bak'; BACKUP DATABASE BFCLogin TO DISK = 'D:\DB_BAK\transfer\BFCLogin.bak'; end
2.主庫192.168.200.117 ftp傳送文件
(1)D:\DB_BAK\transfer下創建文件ftp.txt
open 192.168.201.14 Anonymous binary cd / put D:\DB_BAK\transfer\ekp2.bak put D:\DB_BAK\transfer\BFCLogin.bak bye
(2)D:\DB_BAK\transfer下創建文件transfer.bat
@echo OFF
ftp -s:ftp.txt
(3)創建windows計劃任務,天天3點執行D:\DB_BAK\transfer\transfer.bat
(4)從庫192.168.201.14在master創建刪除DB和kill session存儲過程DELDB
1 ALTER proc [dbo].[DELDB] 2 ( 3 @dbname SYSNAME 4 ) 5 as 6 begin 7 8 9 --DECLARE @dbname SYSNAME 10 --SET @dbname = 'databasename' --這個是要刪除的數據庫庫名 11 12 DECLARE @s NVARCHAR(1000) 13 DECLARE tb CURSOR LOCAL 14 FOR 15 SELECT s = 'kill ' + CAST(spid AS VARCHAR) 16 FROM MASTER..sysprocesses 17 WHERE dbid = DB_ID(@dbname) 18 19 OPEN tb 20 FETCH NEXT FROM tb INTO @s 21 WHILE @@fetch_status = 0 22 BEGIN 23 EXEC (@s) 24 FETCH NEXT FROM tb INTO @s 25 END 26 CLOSE tb 27 DEALLOCATE tb 28 29 --EXEC ('drop database [' + @dbname + ']') 30 end
(5)從庫192.168.201.14在master創建恢復數據庫存儲過程IMPDATA
ALTER proc [dbo].[IMPDATA] as set nocount on begin --prepare for del exec master.dbo.DELDB 'EKP2'; exec master.dbo.DELDB 'BFCLogin'; RESTORE DATABASE BFCLogin FROM DISK = 'E:\datafile\BFCLogin.bak' with replace; RESTORE DATABASE EKP2 FROM DISK = 'E:\datafile\ekp2.bak' with replace; end
(6)從庫192.168.201.14創建job:天天3:40執行
第一步:exec IMPDATA 第二步:在ekp2庫上exec sp_change_users_login 'AUTO_FIX','EKP2';exec sp_change_users_login 'Update_ONE','EKP2','EKP2'; 第三步:在BFCLogin庫上exec sp_change_users_login 'AUTO_FIX','bfcloginSSO';exec sp_change_users_login 'Update_ONE','bfcloginSSO','bfcloginSSO';