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 년 에 직접 올 라 가 는 것 을 권장 합 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
우분투에 SQL 서버 설치Microsoft SQL Server는 오늘날 업계에서 가장 눈에 띄는 데이터베이스 중 하나입니다. 이번 포스팅에서는 우분투에 설치하는 방법을 알려드리겠습니다. sudo 권한이 있는 계정 1단계: 터미널 열기 단축키...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.