SQL Server 는 AlwaysOn 에서 메모리 시트 의"구덩이 밟 기"기록 을 사용 합 니 다.

머리말
최근 온라인 alwayson 환경의 한 데이터베이스 에 메모리 시트 를 사용 하고 있 습 니 다.일주일 정도 모니터링 프로그램 을 통 해 매우 심각 한 문 제 를 발 견 했 습 니 다.이 데이터 베 이 스 는 로그 파일 이 끊 기지 않 고 사용 공간 이 계속 증가 하고 있 습 니 다.(시간 당 로그 백업 이 존재 합 니 다)메모리 시트 데이터 베이스 파일 도 삭제 할 수 없습니다.다음은 제 처리 과정 을 소개 하 겠 습 니 다.더 이상 말씀 드 리 지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
데이터베이스:SQL Server 2014 Enterprise Edition(64-bit)
파일 삭제
알 웨 이 슨 환경 이 아 닌 데이터베이스 테스트 를 사용 합 니 다.
1.메모리 시트 만 들 기

---        
ALTER DATABASE [test] ADD FILEGROUP [test_ag] CONTAINS MEMORY_OPTIMIZED_DATA 
GO 
----          
ALTER DATABASE [test] 
ADD FILE 
( 
 NAME = 'test_memory', 
 FILENAME ='D:\database\memory' 
) 
TO FILEGROUP [test_ag]; 
GO
2.메모리 시트 데이터베이스 파일 삭제

USE [test]
GO
ALTER DATABASE [test] REMOVE FILE [test_memory]
GO

비고:이 때 는 표를 만 들 지 않 았 습 니 다.만 든 후 데이터베이스 파일 을 삭제 하면 삭제 할 수 없습니다.다음은 온라인 문서 의 삭제 방법 을 시도 해 보 겠 습 니 다.
3.공식 관련 삭제 방법
'DBCC SHRINKFILE'을 사용 하여 FILESTREAM 용 기 를 비 웠 더 라 도 각종 시스템 유지보수 이유 로 데이터 베 이 스 는 삭 제 된 파일 에 대한 인용 을 유지 해 야 할 수 있 습 니 다.sp_filestream_force_garbage_collection(TRANSACT-SQL)이 FILESTREAM 쓰레기 수 거 기 를 실행 하여 이 파일 들 을 삭제 할 때 안전하게 작업 할 수 있 습 니 다.FILESTREAM 쓰레기 수 거 기 는 FILESTREAM 용기 에서 모든 파일 을 삭제 하지 않 는 한 ALTER DATABASEREMOVE FILE 작업 은 FILESTREAM 용 기 를 삭제 하고 오 류 를 되 돌 릴 수 없습니다.다음 과정 을 통 해 FILESTREAM 용 기 를 삭제 하 는 것 을 권장 합 니 다.
1.DBCC SHINKFILE(TRANSACT-SQL)을 실행 합 니 다.EMPTYFILE 옵션 을 사용 하여 이 용기 의 활동 내용 을 다른 용기 로 이동 합 니 다.

USE test; 
GO 
-- Create a data file and assume it contains data. 
ALTER DATABASE test 
ADD FILE ( 
 NAME = Test1data, 
 FILENAME = 'D:\database\t1data.ndf', 
 SIZE = 5MB 
 ); 
GO 
-- Empty the data file. 
DBCC SHRINKFILE (test_memory, EMPTYFILE); 
GO

2.FULL 또는 BULK 에 있 는 지 확인LOGED 복구 모델 에서 로그 백업 을 실행 합 니 다.
3.로그 리더 복사 작업 이 실행 되 었 는 지 확인 합 니 다.

통과 logreuse_wait_desc 의 상 태 는 현재 데이터 베 이 스 를 볼 수 있 습 니 다.로그 백업 이 필요 없습니다.물론 로그 백업 을 실 행 했 습 니 다.
4.sp 실행filestream_force_garbage_collection(TRANSACT-SQL)쓰레기 수 거 기 를 강제로 삭제 합 니 다.이 용기 의 파일 이 필요 하지 않 습 니 다.

USE [test]
GO 
EXEC sp_filestream_force_garbage_collection @dbname = N'test' @filename = N' test_memory '; 
5.REMOVE FILE 옵션 이 있 는 ALTER DATABASE 를 실행 하여 이 용 기 를 삭제 합 니 다.

USE [test]
GO
ALTER DATABASE [test] REMOVE FILE [test_memory]
GO

삭제 할 수 없습니다!!!
4.문제 분석
처음에는 alwayson 환경 에서 삭 제 했 습 니 다.복사 본 때문에 삭제 할 수 없 음 을 알려 줍 니 다.뒤에 있 는 알 웨 이 슨 이 아 닌 환경 에서 데이터베이스 테스트 는 삭제 할 수 없습니다.처음에는 메모리 시트 를 만 든 이유 라 고 생각 했 습 니 다.나중에 테스트 는 파일 그룹 과 파일 만 만 만 들 고 파일 을 삭제 하 는 것 도 삭제 할 수 없 었 습 니 다.개인 적 으로 buffer 때 문 일 수 있 습 니 다.버퍼 에 메모리 시트 와 관련 된 파일 이 계속 존재 하 며,DBCC DROPCLEANBUFFERS 명령 을 실행 해도 버퍼 의 메모리 시트 대상 을 비 울 수 없습니다.혼신 의 힘 을 다 해 그것 을 삭제 할 수 없 으 니 결국 항복 할 수 밖 에 없다!!온라인 환경 에서 기다 릴 수 없다.가장 사용 하기 싫 은 생 성 표 구조 로 데 이 터 를 내 보 내 는 방법 으로 새로운 데이터 베 이 스 를 재 구축 할 수 밖 에 없다.
스 크 립 트 생 성 데이터베이스 재 구축
새로운 데이터 베 이 스 를 만 드 는 동시에 현재 데이터 베 이 스 를 사용 할 수 있 도록 합 니 다.
절 차 는 다음 과 같다(정지 유지 보 수 를 허용 하 는 상황 에서 진행).
1.모든 작업 비활성화
2.프로그램 로그 인 을 사용 하지 않 습 니 다.
관련 프로 세 스 가 완료 되 었 음 을 보증 합 니 다.

ALTER LOGIN [test] DISABLE
GO

USE [master]
GO
ALTER DATABASE [test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;--                 

USE [test];---      ,            
GO
3.체크 포 인 트 를 실행 하여 모든 더러 운 페이지 새로 고침

CHECKPOINT

---    buffer         buffer   buffer      
WITH CTE1
 AS ( SELECT COUNT(*) * 8 / 1024 AS dirty_cached_size_MB ,
  COUNT(*) AS dirty_pages,
  CASE database_id
  WHEN 32767 THEN 'ResourceDb'
  ELSE DB_NAME(database_id)
  END AS database_name
 FROM sys.dm_os_buffer_descriptors
 WHERE is_modified = 1
 GROUP BY DB_NAME(database_id),database_id
 ),
 CET2
 AS ( SELECT COUNT(*) * 8 / 1024 AS cached_size_MB ,
  COUNT(*) AS pages,
  CASE database_id
  WHEN 32767 THEN 'ResourceDb'
  ELSE DB_NAME(database_id)
  END AS database_name
 FROM sys.dm_os_buffer_descriptors
 GROUP BY DB_NAME(database_id),database_id
 )
 SELECT 
 CET2.database_name,
 CET2.cached_size_MB,
 --CET2.pages,
 CTE1.dirty_cached_size_MB
 --CTE1.dirty_pages 
 FROM CTE1 INNER JOIN CET2 ON CTE1.database_name = CET2.database_name

---             
ALTER DATABASE [test] 
SET MULTI_USER;
4.데이터베이스 스 크 립 트 생 성




5.오래된 데이터베이스 이름 바 꾸 기
메모:데이터베이스 가 alwayson 에 있다 면 사용 가능 한 데이터베이스 에서 삭제 해 야 합 니 다.그렇지 않 으 면 데이터베이스 이름 을 바 꿀 수 없습니다.

/*
1.                   
2.        、           。
*/
----1.       
USE [master] 
ALTER DATABASE [test] SET OFFLINE WITH ROLLBACK IMMEDIATE;

----2.            ,   test.mdf  test_old.mdf

----3.    
USE [master] 
ALTER DATABASE [test] 
MODIFY FILE (NAME = test, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\test_old.mdf');
GO
ALTER DATABASE [test] 
MODIFY FILE (NAME = test_log, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\test_old_log.ldf');
GO

---4.       
USE [master] 
ALTER DATABASE [test] SET ONLINE


----5.          

USE [test]
GO
ALTER DATABASE [test] MODIFY FILE (NAME=N'test', NEWNAME=N'test_old')
GO
USE [test]
GO
ALTER DATABASE [test] MODIFY FILE (NAME=N'test_log', NEWNAME=N'test_old_log')
GO

----6.      
USE [master] 
EXEC sp_renamedb N'test', N'test_old'; 

----7.  
SELECT *
FROM sys.master_files
WHERE database_id = DB_ID('test_old');
6.새 데이터 베 이 스 를 만 드 는 동시에 스 크 립 트 를 새 데이터베이스 로 가 져 옵 니 다.
표 구조 와 데 이 터 를 ssms 도구 에서 동시에 내 보 내 면 스 크 립 트 가 너무 커서 실행 할 수 없 을 수도 있 습 니 다.sqlcmd 도 구 를 사용 하여 스 크 립 트 가 져 오기 를 실행 할 수 있 습 니 다.구체 적 인 방법 은 바 이 두 를 사용 할 수 있 습 니 다.물론 표 구조 만 내 보 내 고'데이터 내 보 내기'를 통 해 데 이 터 를 동기 화 하 는 다른 방법 도 있다.
메모:"데이터 내 보 내기\데 이 터 를 가 져 오기"방법 으로 데 이 터 를 동기 화하 면"표시 삽입 사용"을 선택 하 십시오.

7.기타
      1.alwayson 이 존재 한다 면 새로운 데이터 베 이 스 를 사용 가능 한 데이터베이스 그룹 에 추가 하 는 것 을 기억 하 세 요.
      2.새로운 데이터 베 이 스 를 백업 작업 에 추가 합 니 다.
      3.신 구 두 데이터베이스 의 표 수량 이 같 는 지 비교 합 니 다.
      4.사용자 의 새로운 데이터베이스 에 로그 인 할 수 있 는 권한 을 설정 합 니 다.
총결산
메모리 테이블 은 2014 년 에 새로 도 입 된 기능 이기 때문에 새로운 기능 의 첫 번 째 버 전에 대한 사용 은 비교적 신중 해 야 한다.특히 온라인 환경 이 그렇다.온라인 에 접속 하기 전에 테스트 를 한 적 이 있 지만 백업 테스트 는 온라인 환경 이 없 기 때문에 무시 되 기 쉽다.다행히 이번 영향 은 새로운 프로젝트 의 데이터 양 과 병발 이 매우 적 고 공휴일 에 정지 유지 보 수 를 허용 하 는 것 이다.아주 큰 시스템 이 라면 내 보 내기 데 이 터 를 가 져 와 야 하 는 데 골 치 아 플 것 입 니 다.자신 이 생산 환경 에서 구 덩이 를 밟 았 기 때문에 이 글 을 쓰 는 것 은 뒤의 사람들 이 구 덩이 를 밟 는 것 을 피 할 수 있 기 를 바란다.
비고:메모리 시트 는 2014 버 전의 alwayson 에서 보조 복사 본 에 동기 화 할 수 없 기 때문에 그의 역할 이 크게 할인 되 었 습 니 다.2016 버 전 은 보조 복사 본 에 동기 화 할 수 있 습 니 다.조건 이 있 으 면 2016 년 에 직접 올 라 가 는 것 을 권장 합 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기