스 크 립 트 공유:남 의 집 미 러 자동화 배치
스 크 립 트 1:
인 스 턴 스 이름:
홈 서버:X
미 러 서버:Y
단계:
1.홈 서버 와 미 러 서버 사이 에 링크 서버 를 만 들 고,SP 를 실행 하기 위해 RPC(Remote procedure call)호출 을 사용 하도록 설정 합 니 다.
lnkX_Y_mirroring(링크 서버 이름)
2.홈 서버 에 아래 SP 를 생 성 합 니 다.
3.필요 한 작업 에 따라 30 분 또는 1 시간 마다 SP(uspMirroring_Configuration)。
4.새 데이터 베 이 스 를 만 들 면 미 러 는 작업 수행 을 통 해 배 치 됩 니 다.
5."Mirroring Configuration"이라는 이름 의 경 고 를 촉발 합 니 다.내용 은"Mirroring Configured for db55555 and safety level is OFF”
/*******************************************************************************
DESCRIPTION: Automatic Mirroring_Configuration for new databases
AUTHOR: Vasan
DATE WRITTEN: 17 MARCH 2015
Automatic Mirroring configuration for newly created user databases:
-------------------------------------------------------------------
Instance names:
---------------
Principle server : X
Mirroring Server : Y
Steps to follow:
1. Create link server between principle server and mirror server with RPC (Remote procedure call) set as true in order to execute the procedure.
Eg : lnk_X_Y_mirroring (Link server name)
2. Create below stored procedure in to principle server.
3. Schedule this Stored procedure (usp_Mirroring_Configuration) with 30mins/1hr interval via job
4. Once the new database created in server mirroring will be configure.
5. Alert will be trigger with the subject anme of Mirroring Configuration
Mail contect:“Mirroring Configured for db_55555 and safety level is OFF”
*******************************************************************************/
Begin
SET NOCOUNT ON;
IF OBJECT_ID(N'tempdb..##tbl_new_databases') IS NOT NULL
BEGIN
DROP TABLE ##tbl_new_databases
END
Declare @dbname nvarchar(max)
Declare @Path nvarchar(500)
Declare @todiskbkp nvarchar(max)
Declare @todisklogbkp nvarchar(max)
Declare @SQL nvarchar(max)
Declare @count SMALLINT
Declare @SQLpartnerprimary nvarchar(max)
Declare @SQLmirror nvarchar(max)
Declare @Mirrorsaftey nvarchar(max)
-- Restore Part Variables
Declare @RestorePath nvarchar(500)
Declare @fromdiskbkp nvarchar(max)
Declare @fromdisklogbkp nvarchar(max)
Declare @SQLrestore nvarchar(max)
Declare @SQLpartnermirror nvarchar(max)
--Mail Part
DECLARE @tableHTML NVARCHAR(MAX) ;
DECLARE @bodyMsg nvarchar(max)
DECLARE @subject nvarchar(max)
SELECT A.name into ##tbl_new_databases
FROM
sys.databases A INNER JOIN sys.database_mirroring B
ON A.database_id=B.database_id
WHERE a.database_id > 4 and B.mirroring_state is NULL and A.is_read_only=0 and state_desc='ONLINE'
if (Select COUNT(*) from ##tbl_new_databases)>0
Begin
DECLARE DB CURSOR FOR
-- Fetching newly created database to configure mirroring
Select name from ##tbl_new_databases
OPEN DB
FETCH NEXT FROM DB INTO @dbname
WHILE @@FETCH_STATUS=0
BEGIN
-- changing recovery model from Simple to Full for new database since new database created with simple recovery model
set @sql= 'if (SELECT recovery_model_desc FROM sys.databases where name = '''+@dbname+''' ) = ''SIMPLE''
begin
Use master
ALTER DATABASE '+@dbname+' SET RECOVERY FULL WITH NO_WAIT
end'
--print @sql
EXEC master.dbo.sp_executesql @SQL
-- Setting Backup folder path for primary server
--(Backup should be placed some common path or with in mirror server for easy recovery process) here i chose mirror server local drive
Set @dbname=@dbname
Set @Path='\\Mirror Server Name (Y)\d$\backup\'+@dbname
set @todiskbkp=@Path+'\'+@dbname+'_'+ replace(CONVERT(VARCHAR(11),GETDATE(),106),' ','')+'.bak'
set @todisklogbkp=@Path+'\'+@dbname+'_'+ replace(CONVERT(VARCHAR(11),GETDATE(),106),' ','')+'.trn'
-- Creating new backup folder for new db in Mirror server
EXEC master.dbo.xp_create_subdir @Path
--Create Database Backups for new db
set @SQL= '
BACKUP DATABASE ' +@dbname+'
TO DISK = '''+@todiskbkp+'''
WITH FORMAT;
BACKUP LOG ' +@dbname+'
TO DISK ='''+@todisklogbkp+'''
WITH FORMAT;
'
--Print @SQL
EXEC master.dbo.sp_executesql @SQL
--Restoring the new dataabse to Mirror server
-- Setting Restor path for mirror server
Set @RestorePath='D:\backup\'+@dbname
set @fromdiskbkp=@RestorePath+'\'+@dbname+'_'+ replace(CONVERT(VARCHAR(11),GETDATE(),106),' ','')+'.bak'
set @fromdisklogbkp=@RestorePath+'\'+@dbname+'_'+ replace(CONVERT(VARCHAR(11),GETDATE(),106),' ','')+'.trn'
--Create the Mirror Database (restoring the new database backup into mirror server)
set @SQLrestore='
RESTORE DATABASE '+@dbname+' FROM DISK = N'''+@fromdiskbkp+''' WITH FILE = 1,
MOVE N'''+@dbname+''' TO N''D:\data\'+@dbname+'.mdf'',
MOVE N'''+@dbname+'_log'' TO N''D:\log\'+@dbname+'.LDF'',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
RESTORE LOG '+@dbname+' FROM DISK = N'''+@fromdisklogbkp+'''
WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
'
--print @SQLrestore
EXEC lnk_X_Y_mirroring.master.dbo.sp_executesql @SQLrestore
--Listener Port on mirror server
set @SQLpartnermirror= '
ALTER DATABASE '+@dbname+'
SET PARTNER=''tcp://Domain Name:Port Number'';
'
--print @SQLpartnermirror
EXEC lnk_X_Y_mirroring.master.dbo.sp_executesql @SQLpartnermirror
--Listener Port on principal server
set @SQLpartnerprimary='
ALTER DATABASE '+@dbname+'
SET PARTNER=''tcp://Domain Name:Port Number'';'
EXEC master.dbo.sp_executesql @SQLpartnerprimary
--Print @SQLpartnerprimary
--Set Mirroring Operating Mode to “High Performance”
set @Mirrorsaftey='
ALTER DATABASE '+@dbname+' SET SAFETY OFF
'
--print @SQLpartnermirror
EXEC master.dbo.sp_executesql @Mirrorsaftey
FETCH NEXT FROM DB INTO @DBNAME
END
CLOSE DB
DEALLOCATE DB
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DBAProfile',
@recipients = '[email protected]',
@subject = 'Mirroring Configuration',
@query='set nocount on SELECT ''Mirroring Configured for ''+ A.name +'' and safety level is ''+ B.[mirroring_safety_level_desc] COLLATE Latin1_General_CI_AI
FROM
sys.databases A
INNER JOIN sys.database_mirroring B
ON A.database_id=B.database_id
WHERE a.database_id > 4 AND A.name in (Select name from ##tbl_new_databases)',
@query_result_no_padding =0,
@query_result_width = 32767,
@query_no_truncate = 1,
@attach_query_result_as_file = 0,
@Body_format = 'text' ,
@append_query_error = 1
Drop table ##tbl_new_databases
END
END
스 크 립 트 2:
준비 단계:
1.보조 SQL Server 인 스 턴 스(버 전,패 치,LICENSE 형식 은 메 인 서버 인 스 턴 스 와 같 습 니 다)를 설치 합 니 다.
2.SQL Server 연결 은 TCP/IP 프로 토 콜 을 사용 합 니 다.
3.백업 및 복구 작업 을 위해 네트워크 공 유 를 설정 합 니 다.\\dfsroot\\sqlbackup 과 유사 합 니 다.
4.xp 사용 허용cmdshell 확장 저장 과정.
하나의 트리거 접근 을 통 해 모든 작업 을 수행 할 수 없습니다.이 방법 은 4 개의 구성 요 소 를 포함 합 니 다.1 개의 이벤트 수신 기 표,1 개의 작업 부하 저장 과정,1 개의 DDL 트리거 와 1 개의 저장 과정 을 일정 간격 으로 실행 하 는 SQL Server 프 록 시 작업 입 니 다.
단계 1:이벤트 수신 기 테이블 1 개 만 들 기
이 표 는 CREATE 데이터베이스 동작 이 발생 했 을 때의 이름과 SQL 이 벤트 를 저장 합 니 다.이벤트 유형 은 중요 하지 않 습 니 다.저 희 는 데이터베이스 이름 에 만 관심 이 있 습 니 다.
USE [master]
GO
/****** Object: Table [dbo].[new_db_table] Script Date: 05/19/2008 15:26:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[new_db_table](
[name] [nvarchar](100) NULL,
[event] [nvarchar](100) NULL
) ON [PRIMARY]
단계 2:자동화 저장 프로시저 생 성
이것 은 동작 표를 검사 하고 백업 초기 화 를 실행 하 는 데 사용 되 는 주요 스 크 립 트 입 니 다.SQL Server 2005 에 서 는 추가 데이터베이스 동작 에 대해 데이터베이스 이벤트 가 없습니다.사실상 CREATE 라 하 더 라 도.DATABASE 사건.SQL Server 2008 에서 해결 되 었 습 니 다.트리거 는 ATTACH 와 CREATE 동작 에 대해 동작 표 에 항목 을 추가 합 니 다.
USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_auto_mirror_config] Script Date: 07/10/2008 10:56:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— ============================================================================
— Author:
— Create date: <4/9/2008>
— Description:
— Syntax:
— =============================================================================
CREATE proc [dbo].[sp_auto_mirror_config]
as
declare @dbname sysname, @bckstmt nvarchar(500), @cmd varchar(250), @bupath varchar(100)
declare @mirrorsp nvarchar(100), @mirrorsql nvarchar(500), @altersql nvarchar(250)
declare @primarysrvr nvarchar(50), @mirrorsrvr nvarchar(50), @witnes***vr nvarchar(50), @domain nvarchar(50)
–set your sql server and backup paths here
set @bupath = ‘\\sql1\sqlbackup’
set @primarysrvr = ‘sql1’
set @mirrorsrvr = ‘sql2’
set @domain = ‘.staging.local’
set @witnes***vr = ‘smres2’
set @mirrorsp = @mirrorsrvr + ‘.master.dbo.sp_executesql ‘
begin
if (select count(*) from new_db_table where event = ‘CREATE_DATABASE’) > 0
begin
create table #userdbs (name sysname)
insert into #userdbs select name from new_db_table
declare cdb cursor for select name from #userdbs
open cdb
fetch cdb into @dbname
while @@fetch_status = 0
begin
–Check to make sure that Auto_Close and Auto_Shrink DB Properties are correct and that Recovery is Full
set @altersql = ‘alter database ‘ + char(91) + @dbname + char(93) + ‘ set AUTO_CLOSE off’
exec (@altersql)
set @altersql = ‘alter database ‘ + char(91) + @dbname + char(93) + ‘ set AUTO_SHRINK on’
exec (@altersql)
set @altersql = ‘alter database ‘ + char(91) + @dbname + char(93) + ‘ set RECOVERY full’
exec (@altersql)
–perform initial database backup
set @bckstmt = ‘backup database ‘ + char(91) + @dbname + char(93)+ ‘ to ‘ +
‘disk = N’ + char(39) + @bupath + ‘\’ + @dbname + ‘.bak’ + char(39)
exec (@bckstmt)
–perform initial database log backup
set @bckstmt = ‘backUp log ‘ + char(91) + @dbname + char(93)+ ‘ to ‘ +
‘disk = N’ + char(39) + @bupath + ‘\’ + @dbname + ‘_log.bak’ + char(39)
exec (@bckstmt)
–perform database restore on linked remote mirror sql server
set @bckstmt = ‘restore database ‘ + char(91) + @dbname + char(93) + ‘ from ‘ +
‘Disk = N’ + char(39) + @bupath + ‘\’ + @dbname + ‘.bak’ + char(39) + ‘ with norecovery, replace’
exec @mirrorsp @bckstmt
–perform database log restore on linked remote mirror sql server
set @bckstmt = ‘restore log ‘ + char(91) + @dbname + char(93) + ‘ from ‘ +
‘Disk = N’ + char(39) + @bupath + ‘\’ + @dbname + ‘_log.bak’ + char(39) + ‘ with norecovery, replace’
exec @mirrorsp @bckstmt
–Initiate the mirroring on The Mirror server:
set @mirrorsql = ‘alter database ‘ + char(91) + @dbname + char(93) + ‘ set partner= N’+ char(39) + ‘TCP://’ + @primarysrvr + @domain + ‘:5022’ + char(39)
exec @mirrorsp @mirrorsql
–Initiate the mirroring on The Primary server:
set @mirrorsql = ‘alter database ‘ + char(91) + @dbname + char(93) + ‘ set partner= N’+ char(39) + ‘TCP://’ + @mirrorsrvr + @domain + ‘:5022’ + char(39)
exec (@mirrorsql)
–Enable the mirroring session on the Witness server:
set @mirrorsql = ‘alter database ‘ + char(91) + @dbname + char(93) + ‘ set witness= N’+ char(39) + ‘TCP://’ + @witnes***vr + @domain + ‘:5022’ + char(39)
exec (@mirrorsql)
–cleanup
delete from new_db_table where name = @dbname
set @cmd = ‘del ‘ + @bupath + ‘\’ + @dbname + ‘.bak’
exec xp_cmdshell @cmd
set @cmd = ‘del ‘ + @bupath + ‘\’ + @dbname + ‘_log.bak’
exec xp_cmdshell @cmd
fetch cdb into @dbname
end
close cdb
deallocate cdb
drop table #userdbs
end
end
STEP 3:트리거 만 들 기
일치 하 는 CREATEDATABASE 의 이벤트 가 발생 하면 데이터베이스 이름 을 이벤트 수신 기 표 에 기록 합 니 다.
/****** Object: DdlTrigger [trg_MirrorDDL] Script Date: 05/19/2008 15:31:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [trg_MirrorDDL]
ON ALL SERVER
FOR CREATE_DATABASE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @data XML;
DECLARE @eventType sysname;
DECLARE @dbname varchar(100);
DECLARE @mirrorsql varchar(500);
SET @data = EVENTDATA();
SET @eventType = @data.value(‘(/EVENT_INSTANCE/EventType)[1]’, ‘sysname’);
SET @dbname = @data.value(‘(/EVENT_INSTANCE/ DatabaseName)[1]’, ‘sysname’);
–Add to new_db_table
Insert new_db_table(name,event) select @dbname,@eventType where not exists (select * from new_db_table where name = @dbname);
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [trg_MirrorDDL] ON ALL SERVER
STEP 4:SQL Server 프 록 시 생 성 작업
이 작업 의 주요 목적 은 사건 수신 기 표 의 새로운 항목 을 감시 하 는 것 이다.나 는 원래 이벤트 수신 기 표 에 트리거 를 사용 하려 고 했 지만 자동화 하고 싶 지 않 을 수도 있 고 작업 을 통 해 필요 에 따라 저장 과정 을 조정 하 는 것 이 더 좋 을 수도 있다.
USE [msdb]
GO
/****** Object: Job [Mirroring Agent] Script Date: 05/19/2008 15:32:54 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 05/19/2008 15:32:54 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]’ AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N’JOB’, @type=N’LOCAL’, @name=N'[Uncategorized (Local)]’
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N’Mirroring Agent’,
@enabled=1,
@notify_level_eventlog=2,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N’No description available.’,
@category_name=N'[Uncategorized (Local)]’,
@owner_login_name=N’SMNET\administrator’, @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Run Mirroring Stored Procedure] Script Date: 05/19/2008 15:32:55 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N’Run Mirroring Stored Procedure’,
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N’TSQL’,
@command=N’USE [master]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[sp_auto_mirror_config]
SELECT ”Return Value” = @return_value
GO’,
@database_name=N’master’,
@flags=4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N’Mirror Agent Schedule’,
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=4,
@freq_subday_interval=5,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20080410,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)’
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
후기:
이 두 스 크 립 트 는 원 격 UNC 경로 로 데 이 터 를 직접 백업 합 니 다.필 자 는 이전에 Bash 에서 미 러 자동화 배치,로그 전송 자동화 배치,검사 와 전환 스 크 립 트,데이터 전송 용 winscp.exe 를 쓴 적 이 있 습 니 다.사고방식 은 바로 이러한 핵심 SQL 을 봉인 하여 호출 하 는 것 입 니 다.
참고:
http://www.sqlservercentral.com/scripts/Mirroring/132938/
https://jeffsani.wordpress.com/2009/03/17/how-to-automate-sql-mirroring/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
TIL# 157 ubuntu에서 mariadb 버전 바꾸기로컬에서는 잘 동작했던 recursive 쿼리가 동작하지 않아 원인을 찾아보니 ubuntu의 마리아디비가 버전이 더 낮아 호환되지 않아서 에러가 발생했던 거였다. 현재 로컬에서 사용하고 배포하여도 사용할 마리아디비 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.