제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under MSSQL
MSSQL 의 대용량 데이터 관리를 위한 파티셔 테이블 에 대해서  시나리오 별로 작성해 보았다.
우선 파티셔닝에 대해 왜 필요한지 어떤게 장점이고, 단점인지 뭔지, 뭐하는건지에 대한 내용은 설명되어있지 않다. 간략하게 설명 드리자면, 대용량 데이터 베이스 환경에서, 데이터가 관리되는, 최소규모의 테이블을 물리적 & 논리적 분할을 통해 I/O 및 기타 성능을 높이는데 목적이 있다. 자세한건 구글링을 통해 알아보도로 하고, 다음 포스팅에 다시한번 파티셔닝을 다룰때 이야기 하도록 하자

  테스트를 위한 시나리오 , SQL 풀 쿼리이다.(다운로드)


포스팅의 내용을 살펴보면,
# DB 생성 또는  기존 DB 에 그룹 추가 후 그룹별 파티셔닝하기 (Primary 1개 + 그룹 5개)
   >  쿼리 연습겸 , 3개는 Create DATABASE 로 나머지 2개는 Alter DataBase 로 처리
# 기본 DB 에 , 쿼리로 DB 에 파일 그룹 추가해 보기 (기존에 단일 그룹  > 그룹으로 추가하는 방법을 알수있음)
# 파티셔닝에 필요한  쿼리들을 알수있다. (Partition Function , Partion Scheme  , Create Table , Create Index )
# 파티셔닝  관리에 필요한 명령어 처리(SPLIT , MERGE , SWITCH)
| 자세한 내용은 상황 별로 설정하여 그때 그때 쿼리 및 이미지 주변에 설명에 두었으니, 참고하길 바랍니다.


DB 생성(그룹동시생성)  및 alter 명령어로 그룹추가
CREATE DATABASE partitionDB
ON
Primary  (Name = "partitionDB_PM" , FileName="D:\TEST_DATA\pDB_M.MDF"),  

FileGroup FG1 (name= "partitionDB_FG1" , FileName  ="D:\TEST_DATA\fDB_1.NDF") ,
FileGroup FG2 (name= "partitionDB_FG2" , FileName  ="D:\TEST_DATA\fDB_2.NDF") ,
FileGroup FG3 (name= "partitionDB_FG3" , FileName  ="D:\TEST_DATA\fDB_3.NDF") 


Alter DataBase [partitionDB] add FileGroup [FG4]
Alter DataBase [partitionDB] add File  (Name ="partitionDB_FG4", FileName = "D:\TEST_DATA\fDB_4.NDF") 
To FileGroup  [FG4]


Alter DataBase [partitionDB] add FileGroup [FG5]
Alter Database [partitionDB] add File (Name = "partitionDB_FG5", FileName = "D:\TEST_DATA\fDB_5.NDF") 
To FileGroup [FG5]


use partitionDB 


DBCC SHOWFILESTAT


파티션 함수생성
CREATE PARTITION FUNCTION [PF_For_Date_FG5] (datetime)
AS
RANGE LEFT FOR VALUES
(
            '2017-03-01 00:00:00' ,  -- 'RegDate 값' <= 2017-03-1 
            '2017-06-01 00:00:00' ,  -- 'RegDate 값' <= 2017-06-1 
            '2017-09-01 00:00:00' ,  -- 'RegDate 값' <= 2017-09-1
            '2017-12-01 00:00:00' ,  -- 'RegDate 값' <= 2017-12-1 
            '2018-03-01 00:00:00'    -- 'RegDate 값' <= 2018-03-1                      
  ) 

파티션 펑션  쿼리 확인
select * From sys.partition_functions
select * From sys.partition_range_values





파티션 스키마 생성
CREATE PARTITION SCHEME [PS_For_Date_FG5] 
AS 
PARTITION [PF_For_Date_FG5] To ([FG1], [FG2], [FG3], [FG4], [FG5])
*  스크립 생성하면 오류난다? 왜지? 그룹5개만들도 다 맞는데?
*   2018-03-1 <  이후 데이터가 들어갈곳이없다.
*  그래서 그룹생성시 파티셔닝할 그룹 + 1개(사실은 1개 이상) 그룹을 추가로 만들어야함


[FG6] 파일그룹 추가
ALTER DATABASE [partitionDB] add FileGroup [FG6]
ALTER DATABASE [partitionDB] add File (name = "partitionDB_FG6" , filename = "D:\TEST_DATA\fDB_6.NDF")

DBCC SHOWFILESTATS

| 오잉? 이상하다
| 방금만든 [partion_FG6] 이 Primary 와 같은 FileGroup 1 에 들어가있다 
| To FileGroup 옵션을 빼먹었다. --; 삭제하고다시하자

[FG6]  파일그룹을 만들고 & 물리적 파일을 [FG6] 그룹에 적재 
① [FG6]  파일그룹을 생성
Alter database [partitionDB] remove filegroup [FG6] -- 그룹  삭제
Alter database [partitionDB] remove file [partitionDB_FG6] -- 파일  삭제

ALTER DATABASE [partitionDB] add FileGroup [FG6]
ALTER DATABASE [partitionDB] add File (name = "partitionDB_FG6" , filename = "D:\TEST_DATA\fDB_6.NDF") To Filegroup [FG6]
 만약  그룹(TO Filegroup 그룹명) 으로 생성된 파일그룹 삭제시 ① FILE (*.NDF)를 삭제 후  ② FileGroup 을 순서대로
삭제되어야 한다. (논리적으로 [FG6] 안에 물리 파일인[partitionDB_FG6] 이 있기때문)

DBCC SHOWFILESTATS
 | FileGroup 7번을 정상적으로 할당 받았다



② 파티션 스키마에 [FG6]
CREATE PARTITION SCHEME [PS_For_Date_FG5] 
AS 
PARTITION [PF_For_Date_FG5] To ([FG1], [FG2], [FG3], [FG4], [FG5])


| 또 오류  왜 그러지?
| 방금 만든 [FG6] 를 추가해야한다.
| 기본 [FG1] ~ [FG5] 까지는 파티션 함수에서 지정한 조건에 맞는 데이터가 파티셔닝되고
| 그 외의 조건은 [FG6] 에 들어가도록,
| PARTITION SCHEME 생성시에는 PARTITION FUNCTION 지정한 그룹 갯수 + 1개 이상을 추가 해야 한다.



아래쿼리 정상처리
CREATE PARTITION SCHEME [PS_For_Date_FG5] 
AS 
PARTITION [PF_For_Date_FG5] To ([FG1], [FG2], [FG3], [FG4], [FG5] , [FG6])


테이블 생성 & 인덱스 생성시 파티셔닝 하기
Create table Tbl 
(
      idx int ,  
      RegDate datetime
)  ON PS_For_Date_FG5(regdate)
| 테이블에 인덱스 생성시 파티션용 스키마 적용 하여 테이블 파티셔닝 한다.



CREATE NONCLUSTERED INDEX IDX_DUMMY
ON Tbl (regDate)
ON PS_For_Date_FG5 (RegDate) 
| 위의 테이블 생성시 , 테이블에 인덱스 생성시 파티션용 스키마 적용 하여 테이블 파티셔닝 한다.
| 나는 일부러 넌클러스터 인덱스로 해보았다. 다음 포스팅에 파티션인덱스를 다룰때 3가지 "인덱스없이,넌클러스터,클러스터" 를 해보자


tbl에 더미 데이터 넣기
declare @i int
declare @d datetime
set @i = 1 
set @d = '2017-01-01'
BEGIN TRAN
WHILE @i <= 10000
Begin 
        set @i = @i + 1
        insert Tbl values (@i , dateadd(hh ,  @i , @d) )
End
COMMIT TRAN


분할된 파티션 정보를 그때 그때 눈으로 확인하기위해 아래 프로시져를 생성해두자
Create proc sp_partiton_view  -- drop proc sp_partiton_view
        @tbl varchar(50)
as
select 
        F.Name ,
        G.partition_number  , 
        G.Rows ,  
        E.value  
rom 
sys.destination_data_spaces A
        left outer join sys.indexes B on A.partition_scheme_id = B.data_space_id 
        left outer join sys.tables C  on B.object_id = C.object_id
        left outer join sys.partition_schemes D on B.data_space_id = D.data_space_id 
        left outer join sys.partition_range_values E on E.function_id = D.function_id and E.boundary_id = A.destination_id
        left outer join sys.filegroups F on F.data_space_id = A.data_space_id  
        left outer  join sys.partitions G on G.object_id = C.object_id and  G.index_id = B.index_id 
        
                                                        and G.partition_number = A.destination_id
where C.name = @tbl and B.name is not null order by partition_number asc



위에 만들어지 프로시져를 한번 써서, 파티션별로 들어간 데이터 갯수 눈으로 확인해보자
sp_partiton_view 'tbl'

기존 (파티셔닝기준) 데이터로  파티션 위치 확인
SELECT $PARTITION.[PF_FOR_DATE_FG5] ('2017-06-01') 
SELECT $PARTITION.[PF_FOR_DATE_FG5] ('2018-07-01') 
| '2017-06-01' 날짜로 PF_For_Date_FG5 파티션 평션 적용시켜 insert 하면  몇번째 Partition_number 로 들어갈까?
| '2018-07-01' 날짜로 PF_For_Date_FG5 파티션 평션 적용시켜 insert 하면  몇번째 Partition_number 로 들어갈까?
 결과는 아래와 같다.






파티션 SPLIT ①

" 새로운 파티션 추가 #1
시나리오 :  새로운 그룹 [FG7] 생성 후 2018-06-01 추가 "

추가전, 현재 상태를 먼저 확인해보자
sp_partiton_view 'tbl'

| 현재 파티셔닝된 상태 확인

새로 추가될 그룹 추가 생성
ALTER DataBase [partitionDB] add filegroup [FG7]
ALTER database [partitionDB]  add File (Name = "partitionDB_FG7", FileName = "D:\TEST_DATA\fDB_7.NDF") To FileGroup [FG7]

파티션 스키마에 추가 다음으로 파일그룹 FG7 지정
ALTER PARTITION SCHEME PS_For_Date_FG5 Next USED [FG7]
ALTER PARTITION FUNCTION PF_For_Date_FG5()  SPLIT RANGE('2018-06-01 00:00:00') -- 함수명뒤에 '()' 없으며 구문 오류남
| 파티션 평션에 부합되지않은 [FG6] 에 있던 데이터들 중 추가된 파티션 정보에 부합되는 정보가 있으면
| 그쪽 그룹으로 데이터가 이동하는 작업이(삭제/입력 I/O발생 나머지는 그대로 잔류




추가된 Partition_number 6 : [FG7] 확인
sp_partiton_view 'tbl'
| 새로운 파티션 스키마 정보가 삽입되면서 partition_no:6 에서 -> partition_no : 7 로 밀림

제대로 분할되었는지 테스트 INSERT
insert tbl values(10001 , '2018-04-01') -- 2번  실행
insert tbl values(10001 , '2018-06-01') -- 3번 실행



sp_partiton_view 'tbl'




파티션 SPLIT ②

 새로운 파티션 추가 #2
시나리오 : 기존에 파티션정보에 이미 '2017-01-01' 이 사용중인 [FG1] 를 다른 조건으로 파티셔닝하기
[FG6] 은 기존에 위의 조건 외의 데이터가들어가는 그룹이었다  "
 ALTER PARTITION SCHEME PS_For_Date_FG5 Next USED [FG1]
    ALTER PARTITION FUNCTION PF_For_Date_FG5()  SPLIT RANGE('2018-09-01 00:00:00') 
추가된 Partition_number 6 : [FG7] 확인
sp_partiton_view 'tbl'


insert tbl values(10001 , '2018-07-01') -- 2번 실행
insert tbl values(10001 , '2018-08-01') -- 4번 실행
sp_partiton_view 'tbl'




파티션 SPLIT ③

 새로운 파티션 추가 #3
시나리오 : 새로운 그룹 [FG8] 생성 후 2018-06-01 추가 "
ALTER DataBase [partitionDB] add filegroup [FG8]
ALTER database [partitionDB]  add File (Name = "partitionDB_FG8", FileName = "D:\TEST_DATA\fDB_8.NDF") To FileGroup [FG8]


스키마에 [FG8] 추가하고 범위 지정
ALTER PARTITION SCHEME PS_For_Date_FG5 Next USED [FG8]
ALTER PARTITION FUNCTION PF_For_Date_FG5()  SPLIT RANGE('2018-12-01 00:00:00')
sp_partiton_view 'tbl'

| 기본 그룹의 partitinu_number 가 다시 도 밀려나는걸 볼 수 있다.

insert tbl values(10001 , '2018-11-01') -- 4번 실행
insert tbl values(10001 , '2018-12-01') -- 5번 실행

sp_partiton_view 'tbl'




 파티션 MERGE
> 기존에 분할된 파티션 영역을 합친다.
> '2018-12-01 00:00:00.000' 조건을 가지고 있는 Partition_Num 8 (FG8)을 Merge(합침)
> 합쳤을때 데이터가 파티션 함수 조건에 맞는 데이터가 아니라면 기본 그룹에 INSERT 됨

 ALTER PARTITION FUNCTION PF_For_Date_FG5() MERGE RANGE ('2018-12-01 00:00:00.000')

sp_partiton_view 'tbl'


| Merge 한  파티션에 있던 데이터들('2018-12-01') 이  파티셔닝된 조건에 맞는 파티션이 없으므로,  
기본 파티션된 그룹 partition_number 8 인 [FG6] 에 들어감.
 

중간에 있는 2018-06-01 파티션을 Merge 해보자
ALTER PARTITION FUNCTION PF_For_Date_FG5() MERGE RANGE ('2018-06-01 00:00:00.000')
sp_partiton_view 'tbl'

| Merge 한  파티션에 있던 데이터들('2018-06-01') 이  파티셔닝된 조건에 맞는 파티션이 partition_number 6번에
있으므로, partition_number 6 인 [FG1] 에 들어감.
 



파티션 SWITCH 
> SWITCH 작업 전에 두 테이블이 존재해야 합니다..
> 파티션 SWITCH 조건을 MSDN 을 통해 찾아보면
   ①받는 파티션이 존재하되 비어 있어야 합니다.
   ②분할되지 않은 받는 테이블이 존재하되 비어 있어야 합니다
   ③파티션은 동일한 열에 있어야 합니다. 
   ④원본 및 대상 테이블은 동일한 파일 그룹을 공유해야 합니다. 


파티셔닝된 Tbl 의 구조를 확인하고  같은구조의 tbl_tmp 를 만든다.
(위의 조건을 무시하고 primary 그룹에 그냥 만들어보자)
select * from tbl
select * into tbl_tmp from tbl where idx = -1 -- 스키마만 복사
SWITCH 시작
 ALTER TABLE tbl SWITCH PARTITION 5 TO TBL_TMP


| 오류! SWITCH 하기위해 PARTITION_NUM 6 번 데이터를 tbl_tmp 로 switching 시도했으나 안됨
| ④ 원본 및 대상 테이블은 동일한 파일 그룹을 공유해야 합니다. 항목 위반
< 각각의 테이블 파티션 정보 & 테이블 정보 보기 >
원본 tbl  파티션된 정보보기
SELECT * FROM SYS.PARTITIONS where object_id = object_id('tbl')  
order by index_id  , partition_number 


타켓 tbl_tmp  파티션된 정보보기
SELECT * FROM SYS.PARTITIONS where object_id = object_id('tbl_tmp')  
order by index_id  , partition_number 






 각 테이블이 어떤구조로 있는지 눈으로 확인 

select 'tbl' , * from sys.indexes where object_id = object_id('tbl') 
select 'tbl_tmp' , * from sys.indexes where object_id = object_id('tbl_tmp')




select * From sys.data_spaces where data_space_id = 65601 -- PRIMARY 에 속해있다.
select * From sys.data_spaces where data_space_id = 1 -- 파티션 그룹(PARTITION_SCHEME)에 속해있다


drop table tbl_tmp -- drop 하고 다시생성

스키마 참조하여 만들되,  이번엔 일부러 컬럼명만 다르게 해보았다.
 create table tbl_tmp (idx2 int , regdate2 datetime) on [PS_For_Date_FG5](regdate2)

> 다시 스위칭 시킨다. PARTITION_NUM 5 번에 있는거 4145개 데이터 SWITCH
> 각각의 원본의 PARTITION NUM 과 타깃(TBL_TMP) 파티션 번호를 틀리게 줘봤다

ALTER TABLE tbl SWITCH PARTITION 5 TO TBL_TMP PARTITION 5

| 오류 발생 컬럼명 다르다고 오류



스키마 참조하여 만들되,  이번에는 컬럼명도 같게 MSDN 시키는대로
drop table tbl_tmp
create table tbl_tmp (idx int , regdate datetime) on [PS_For_Date_FG5](regdate)
파티션 번호 다르게 해볼까?  오류 발생
ALTER TABLE tbl SWITCH PARTITION 5 TO TBL_TMP PARTITION 1
> 오류 : 그룹이 다르다고 오류를 뱉길래 조건이 다른 1/6번 그룹은 같은 FG1 얘는될까?

ALTER TABLE tbl SWITCH PARTITION 1 TO TBL_TMP PARTITION 6
> 오류 : 정의한 범위가 테이블 'partitionDB.dbo.TBL_TMP'의 파티션 6에서 정의한 범위에 포함되지 않습니다.
원하는대로 같은 파티션에 SWICH 처리 → [성공]
ALTER TABLE tbl SWITCH PARTITION 5 TO TBL_TMP PARTITION 5


확인 [FG5] 에 있는 데이터들이 모두 TBL_TMP 로 INSERT 되었다.
sp_partiton_view 'tbl'


테이블을 확인해보자
PARTITION_NUMBER 5 에 있던 데이터 1985개 그대로 TBL_TMP 에 들어가있다.
select count(*) From TBL_TMP
| 정확히 이야기하자면 TBL_TMP 테이블의 PARTITION_NUM 5 에 FG5 에 들어가있다.
| PARTITION_NUMBER 5 에 그대로 들어가있다.




SELECT * FROM SYS.PARTITIONS
Where object_id = object_id('tbl_tmp')  Order by index_id  , partition_number 



SELECT * FROM SYS.PARTITIONS 
Where object_id = object_id('tbl')  Order by index_id  , partition_number 



| index_id 가 왜  2개지?  나중에  인덱스에 대해서 포스팅할대 설명하기로하자 급하신분들은 구글링 하시길



PARTITION_NUMBER 5를  삭제하자(삭제는아니고 사실 Merge 이다)
sp_partiton_view 'tbl' -- 삭제 전확인


PARTITION_NUMBER 5를  삭제하자 (Merge)
 ALTER PARTITION FUNCTION PF_For_Date_FG5() MERGE RANGE ('2018-03-01 00:00:00.000')

sp_partiton_view 'tbl' -- 삭제 후 확인 (사실 삭제라기 보다 합쳐젔다)


아차! 테스트하다가 파티션 범위 밖의 데이터를 입력해보는것을 해보지 못하였다.

sp_partiton_view 'tbl'


파티셔닝 조건인 value 에 포함이 안되는 값(날짜) insert
 insert tbl values(10002 , '2018-12-01')  -- 5번 실행


sp_partiton_view 'tbl'



파티션 테이블 에서는 새로 알아야할 명령어 및 개념들이 몇가지 있다.

그리고 인덱스 상관관계 또한 이해해야 할 부분이 있다. 이는, 다음 포스팅때 오늘 실습해본 쿼리를 중심으로 알아보기로 
하겠다.

[##_http://blog.sooli.com/owner/entry/edit/1L%7C2816901162.sql%7C%7C_##]  테스트를 위한 시나리오 , SQL 풀 쿼리이다.(다운로드)



2018/01/31 16:37 2018/01/31 16:37
Posted
Filed under MSSQL

SYNONYM 설정시 현재 (2016) 까지는
데이터베이스.스키마.개체명 까지 다 넣어야,,, 
동의어로 지정할수있다
(테이블명 까지 지정해줘야함 )

TestDb  데이터베이스에  TestSchema  에 TestTable   // FQN 접근시
→ select * from  TestDb.
TestSchema.TestTable   

create SYNONYM 동의어명 For   데이터베이서.스키마.테이블명

Create SYNONYM  SN_Test For TestDb.TestSchema.TestTable 
→ select * from SN_Test 


* 기술적으로 복잡함이 없어 FAQ로 구성해 보았다.
-------------------------------------------------------------------------------------------------------------------------
Q) 시놈님 생성은?
(위에) create SYNONYM 동의어명 For   데이터베이서.스키마.테이블명

Q) 시놈님 생성시 dB명만 해도 되나요?
Create SYNONYM  SN_Test For TestDb   만들어짐!! 오케이 된다!
 select * from SN_Test.스키마명.테이블명   -> 오류!! 안됨!!

만들어는 지나, 접근이 안됨,,
결론은 안됨!!!!!

Q) 그럼 dB명.스키마 까지... 해도 되나요?
 이거? Create SYNONYM  SN_Test For TestDb .TestSchema 
 select * from SN_Test.테이블명 오류!! 안됨!!

만들어는 지나 접근이 안됨
결론은 안됨!!!!!

Q) 시놈님 삭제는 ?   
drop SYNONYM 동의어명;

Q) 시놈님 수정은?
수정은없음 drop & Create

Q) 시놈님과 연동 동의어의 개체가 사라지면? 
    따로 drop 해줘야함  - 관리필요 (drop SYNONYM 동의어명)

Q) 테이블 새로 만들어지면 시놈님 자동생성안되나요 ? 
안됨,  따로 create 해줘야함  - 관리필요


Q) create 시놈님 안에 연결 개체를 바꿀려면(수정)?  
drop 하고 create 하삼 alter 없음

Q) 테이블 100개면 시놈님 연결하러면요?
create SYNONYM 100번해야함 해야함

Q) 프로시져도되요?  
  프로시져는 개체 , 당연됨 함수도됨 그냥 똑같음
 
 Create SYNONYM 동의어명 For sp_memberUtil
    -> exec 
동의어명

Q) 프로시저 시놈님만들었는데? 파라미터는 어떻게해야되나요?
   

   -> exec 동의어명  'C' , 'UserID'     -- 기존 프로시져와 똑같이 하면됨 
   -> 기존 프로지서 exec sp_memberUtil  'C' , 'UserID'
  
Q) 테이블 2000개 프로시져 1만개... 모두 만들려고합니다...
     쉽게 만들수있는방법은 ?  

    -- 참고 ---------------------------------
    select * from sys.tables
    select * from sys.synonyms

    아래와같이 동적으로 생성이 가능하다. :)
    
 

     declare @var nvarchar(100)
     set @var = 'create synonym '  + 시놈님명 +  ' for ' + 객체명
     EXEC SP_EXECUTESQL @var  --    EXEC(@var) 로 해도됨

     또는, 변수로 처리

     
declare @var nvarchar(1000)
     declare @tbl  nvarchar(20)
     declare @syName  nvarchar(20)

     set @syName = 'sy_t'
     set @tbl  = 'partitionDb.dbo.tbl'

     set @var = 'create synonym ' + @syName + ' for ' + @tbl

     EXEC SP_EXECUTESQL  -- 또는,    EXEC (@var)

     단, 아래와 같이 sp_executesql 생성시 파라미터로 전달은 안된다.

     set @syName = 'sy_t'
     set @tbl  = 'tbl'

     -- 파라미터로 객체명 전달시 오류 발생
     set @var = 'create synonym  @syName   for  @tbl'
     EXEC SP_EXECUTESQL @var , N'@syName  varchar(20) , @tbl  varchar(20)' , @syName , @tbl

 


Q) 전 마우스로 밖에못하는데 어디서 만들어요?
   당황하지말고 SSMS 에 DB [+] 클릭  Table 있고  View 있고 그아래쯤 SYNONYM 
   거기서 우클릭해서 해보길.



------- 2018-01-29 추가 ----------------------------------------------------------------------------------------------------
Q) 시놈님과 연결한 [A] 테이블을 drop  후 같은이름으로 테이블[A] 다시 만들었는데  어떻게 되나요?
시놈님도 다시 만들어야하나요?

결론 부터 말하면 기존에 [A] 테이블과의 연동이 끊기고 새로만든 [A] 테이블과 자동연동된다.
이는 시놈님 구조가 테이블의 object_id 가 아닌 테이블명과 연결되기때문,

-- 시놈님의 시스템 테이블
 select * from  sys.synonyms  -- base_object_name 이 실제 연동된 테이블

① 위의  sys.synonyms  테이블을 select 해보시면  base_object_name 에 연결된 테이블 명칭이있습니다.
② 시놈님의 동의어 만들때 개체의 object_id를 이용하지 않습니다. (이름(테이블명) 사용함)
③ 결론은 다시 만들어진 테이블 A 와 시놈님의 자동으로 연동 됩니다.(이유는 ②번과 같습니다.)

* 시나리오
1년전 특정 로깅을 위해 Table_X 테이블을 만들었고  Table_X 동의어로 synonym  "SY_X"를 설정하여,,,
프로시저 및 접근시 SY_X 로 모두처리하였습니다. 5년후 많이 쓰지않는 테이블 이고, 정책에 반하는 테이블이라, drop 시키고, 새로운 기획에 의해 Table_X 를 다시 만듬 SY_X  는 그대로 유효한가?



위에서 이야기한대로 object id 가 아닌 테이블명 으로 연동되어 그대로 이용가능하나, 새로만든 테이블의
구조가 기존과 다르다면, SY_X로 박혀있는 프로시져 기타 소스들은확인 & 수정 할 필요가 있다.





 
  
 
 
    
  





2018/01/18 15:52 2018/01/18 15:52
Posted
Filed under MSSQL
https://support.microsoft.com/ko-kr/help/2860024/you-cannot-toggle-the-results-pane-in-sql-server-management-studio


단축키를 누르면 작동을 하지 않고 두번째 키를 기다리는중 상태로 인하여 UI도구를 클릭해야되는 경우가 발생하여 찾아봤는데 SQL Server Management Studio.vssettings 이게 손상되었다고 합니다.  SSMS 도구 옵션에 키보드를 다시설정 초기화를 진행하면 해당문제는 사라집니다.

2018/01/10 11:36 2018/01/10 11:36
Posted
Filed under MSSQL
http://thelowlydba.blogspot.kr/2016/08 ··· g-r.html

https://docs.microsoft.com/en-us/sql/advanced-analytics/r/set-up-sql-server-r-services-in-database

단독서버에서는 문제가 없는데 Always On 에서 기본 스크립트 구문조차도 실행되지 않고 계속 멍때리는 현상때문에 난처했습니다. 공식문서에는 MSCS 구성에서는 지원불가인 반면에 Always On은 지원불가는 아니다?라는 문구가 보여서 안되는게 아니고 되는건가보네? 하다보니 위에 사이트를 찾아서 해결하였습니다.
이유가 길이가 긴 문자 경로를 인식하지 못해서 발생하는 오류라고하는데 단독서버에는 이런증상이 전혀 발생하지 않아서 아이러니 한 이슈였습니다.
도메인 환경과 아닌 환경의 차이인지는 모르겠으니 일단 해결방법은 위사이트에 설명처럼 ExtensibilityData 폴더를 생성해주고 환경설정 경로를 바꿔주면 해결이 가능합니다. 문제는 폴더만 생성하면 MSSQLSERVER01~20  계정 폴더가 없어서 또 오류를 뿜어내니 그냥 폴더 복사 붙여넣기 하고 NT Service\MSSQLLaunchpad 서비스 계정에 모든권한을 부여해주고나니 이슈가 해결되었습니다.

EXEC sp_execute_external_script  @language =N'R',
@script=N'
OutputDataSet <- InputDataSet;
',
@input_data_1 =N'SELECT 1 AS hello'
WITH RESULT SETS (([hello] int not null));
GO

샘플구문 실행하니 반가운 헬로 1 이 떨어지네요.
2017/12/15 13:30 2017/12/15 13:30
Posted
Filed under MSSQL
https://www.mssqltips.com/sqlservertip/4558/sql-server-launchpad-service-cannot-be-started/
MSSQL 2016 R 서비스 설치할때나 설치후에 이문제때문에 지웠다 깔았다는 연속으로 해서 검색해보니 링크와 같은 해결방법이 나왔었습니다.
보안설정한다고 ISMS 가이드 문서에 콘솔 로그온에 USERS 그룹이 기본값으로는 존재하는데 이걸 삭제한겁니다. NTSERVICE\MSSQLLaunchpad 를 관리자 그룹에 등록해도 에러가 발생하길레 스크립트 권한에서 막혔나 싶어서 이것저것 권한을 넣어봐도 답없음이였습니다.
그런데 실제서비스 권한은 MSSQLSERVER01부터 20까지 필요한거였었습니다.
사용자 삽입 이미지
보안 이벤트 4625를 기록하며 실패하는 로그입니다.
사용자 삽입 이미지
ISMS 보안가이드를 적용한다면 SQLRUSERGROUP 을 등록하면 해결이 됩니다.
저그룹을 관리자 그룹에 등록하는건 어떻냐고 하는데 스크립트를 사용하는 계정을 관리자로 등록하면 보안에 더큰 문제가 발생하기 때문입니다. 스크립트 하나로 시스템을 쉽게 변경하여 제어할수 있기 때문에 최소한의 권한을 유지하는것이 권고사항입니다.
사용자 삽입 이미지

ISMS 보안권고 가이드 문서에는 기본공유 제거와 RemoteRegistry 를 비활성 시키라고 하는데 이걸 반영하면 클러스터 서비스가 내려가는 재앙을 경험할수 있습니다.
ISMS 시행한지 정말 오래되었는데 문서에 클러스터 서비스는 예외처리를 권고한다고 제시하면 관리자들이 당황하는 일은 없을텐데 아직도 이런다는게 이해가 안갑니다.
4년전에도 서비스 영향을 받기 때문에 적용불가능하다는걸 일일이 체크하고 예외문서 작성한 기억이 납니다. 


2017/11/08 03:12 2017/11/08 03:12