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

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

It is necessary to start SQL Server in single user mode before master database can be restored. It is very easy to start SQL Server server in single user mode. Follow the tutorial SQL SERVER – Start SQL Server Instance in Single User Mode.

Once SQL Server instance is running in single user mode, immediately connect it using sqlcmd and run following command to restore the master database.


RESTORE DATABASE master FROM DISK = 'C:\BackupLocation\master.bak' WITH REPLACE;
GO


사용자 삽입 이미지

MSSQL master 데이터베이스를 리빌드 하고 난후 백업을 복원해야되는 일이 발생했을때 찾아봤던 내용입니다. mater 데이터 베이스가 초기화 되어버리면 계정이나 운영되는 DB 리스트들이 안보이기에 일일이 계정등록하고 매핑 시켜주는 일이 번거로워서 master 백업을 복원해 봤습니다. 시스템 데이터 베이스가 아닌 DB들은 UI 관리도구에서 복원이 가능하지만 master 는 위 내용처럼 싱글유저 모드로 서비스를 시작하고 난후 커맨드로 복원을 진행해야 됩니다.
예전에 클러스터가 떨어졌을때 master 데이터베이스가 크래쉬 나서 서비스가 시작이 안되어 리빌드하고 계정을 일일이 넣어주고 매핑해줬었는데 복원하는 방법이 위와같이 절차만 알고 있으면 복원이 쉽습니다. 모를때는 노가다라도 하면서 일일이 넣어주곤 하는데 이게 DB리스트가 많아지고 계정이 많아지고 그리고 각각의 DB계정들 암호를 모르고 있다면 재앙수준이죠.

2016/06/29 19:54 2016/06/29 19:54
Posted
Filed under MSSQL
http://blogs.msdn.com/b/psssql/archive ··· 008.aspx

In SQL Server 2005, we introduced a different method than in previous versions to rebuild system databases (affectionately known as "rebuild master"). You were required to use the setup.exe program with command line switches.

This is no different in SQL Server 2008 but the command line switches have changed some and the process behind the scenes to rebuild the system databases (master, model, and msdb) is also a bit different.

Currently the SQL Server 2008 Books Online only mention an option for setup called /REBUILDDATABSES (See this link) but this information is not correct so I'll outline how to do this here in this blog post. We will also get our documentation updated to reflect this information.

The syntax for using setup.exe to rebuild the system databases is as follows:

setup.exe

/QUIET

/ACTION=REBUILDDATABASE

/INSTANCENAME=instance_name

/SQLSYSADMINACCOUNTS= accounts

[/SAPWD=password]

[/SQLCOLLATION=collation_name]

Here are the details about how to use this syntax and how it works:

1. Find setup.exe either from your original media or the "local" setup.exe as found in the directory where you have installed SQL Server in the 100\Setup BootStrap\Release directory. So on my machine, I changed directory to C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release.

2. Run setup.exe with the following syntax from a Windows command prompt:

If you have SQL configured for Windows Authentication Mode use this syntax:

setup /ACTION=REBUILDDATABASE /QUIET /INSTANCENAME=<instance name> /SQLSYSADMINACCOUNTS=<accounts>

where

<instance name> is either the name of your named instance or MSSQLSERVER for the default instance

<accounts> are Windows groups or individual accounts to provision as sysadmin

If you have SQL configured for Mixed Authentication Mode use the same syntax except you must also provide the /SAPWD parameter to specify the SA password. If you don't, you will get an error.

If you want to rebuild the system databases with a different collation than what you used to install SQL Server, you would need to supply the /SQLCOLLATION parameter. If you don't supply this parameter, then SQL Server will rebuild the system databases with the collation you selected when you installed SQL Server.

3. When setup has completed rebuilding the system databases, it will return to the command prompt with no messages (It always first prints out the version). If you have any syntax problems or issues with parameters you will see these errors in the command window. If you don't see any errors, then you will need to examine the "Summary" log file to verify it was completely successful.

클러스터를 구성한 MSSQL2008 서버에서 강제종료하고 발생한 서비스 시작 실패였습니다. 이벤트 로그에서는 master DB와 Log 가 손상되어 종료되었다는 구문이 나와서 master DB가 문제가 되어 복구 문제에서 검색해서 나온 결과입니다. 템플릿 폴더에서 복사했더니 역시 복구가 되지 않고 위 명령 옵션을 수행해야만 master 데이터베이스가 복구가 되었습니다. 서비스가 시작이 되어야만 백업된 DB를 복구를 하든 말든 할건데 계정이 많지 않다면 뭐 수동으로 일일이 넣어도 시간은 늦지 않을거라는 판단입니다. 그냥 클러스터 다시 설치할까 고민하다가 한번 검색해서 찾아보구 실행해서 복구해본 포스팅입니다. 서버가 무응답이 길어져서 그냥 iSCSI 스토리지 서버를 강제 종료한것이 화근이 되었던 것입니다. MySQL도 멀쩡하였는데 MSSQL만 이런현상이 있어서 난감했던 몇일이였습니다. 다행히 운영중이지 않아 별문제가 없었지만 실제로 이런일이 발생하면 발만 동동 구르기 때문에  신속히 MS에 지원받는게 빠를수도 있습니다( DB다운되면 어떤일이 벌어지는지 다 아시겠지만... 흠흠) 위에 내용보면 2005 나 2008이나 별반 다를게 없다고 나온거 보면 2005도 같은 명령을 수행하는가 봅니다. 누군가 이글을 읽어보고 영문이라서 무심코 그냥 대충 무시하고 할수 있는데 필자처럼 SA패스워드를 무시하고 진행을 하였더니 에러를 뿜어주는 삽질을 피하지 못할것입니다. 위설명처럼 반드시 sa 패스워드는 넣으라고 지시하고 있습니다.


2012/04/15 05:41 2012/04/15 05:41
Posted
Filed under MSSQL

사용자 삽입 이미지
우리가 흔히 시스템에서 이중화라는 말을 하곤합니다. 서비스 이중화인지 데이터의 이중화인지는 관련업무 서비스가 어떻게 진행되느냐에 따라 달라지곤 하겠죠.
일일이 백업을 배치로 걸어놓느냐 아니면 클러스터를 하느냐 여러가지 DB 이중화에 대한 고민을 하게 됩니다. 그래서 MSSQL2005 이상부터는 DB 미러링이라는 기능이 있습니다. 정말 정말 좋은 기능중의 하나라고 장담합니다. 필자가 클러스터보다 더 매력을 느끼는 기능이 바로 미러링 기능입니다.
사용자 삽입 이미지
일단 클러스터는 공유볼륨을 구성하는 스토리지가 있어야 한다는것입니다. 비용 많이 듭니다. 하지만 미러링의 장점은 위 그림과 같이 PC든 가상화든 트랙잭션 I/O가 실시간으로 아주 심하지만 않으면(대규모 엔터프라이즈가 아닌한 이럴일이 거의 없다) 공간의 제한을 받지 않는다는것입니다. 레이드 미러링 처럼 DB도 미러링이 실시간으로 된다는것이 참 신기 하기만 합니다. 요즘 기가빗 네트워크 망을 이용하기 때문에 대여폭 걱정도 없습니다. 기가빗 대여폭을 감당하기에 디스크 I/O 성능 부터 걱정이 되니까요...
사용자 삽입 이미지
DB미러링도 Failover 기능이 가능합니다. MS에 기술 관계자에게 물어본 결과 위 내용을 들었습니다. 실질적으로 해본건 닷넷2.0 환경에서 해봤다고 하고 나머지는 테스트 시뮬레이션을 해보지 않았다고 합니다. 그럼 사이트를 닷넷 2.0이상만 해야되는 건가?라는 말을 하다가 기술 담당자는 ODBC,JDBC 다 된다고 전해주었습니다. 해당 링크 사이트도 전달해주더군요. 필자가 테스트 해본건 Native Client 커넥트를 사용했습니다. 개발자의 도움을 얻었죠.친한 개발자라 적극적으로 도와준 덕분에 이 결과를 얻었습니다.

<%

 connstr = "Provider=SQLNCLI10.1;Password=db_pass;Persist Security Info=True;User ID=dbuser_id;Initial Catalog=DB name;Data Source=ip address A;Failover Partner=ip address B"


 set dbo = server.CreateObject("ADODB.Connection")
 dbo.open(connstr)
 
 set rs = dbo.Execute("select top 200 * FROM [DB].[table_id].[xxx]")

  
 do while Not rs.Eof

 Response.Write(rs(0) & "<BR>")
 Response.Write(rs(0).Name & "<BR>")
 rs.MoveNext


 loop

%>

위 커넥트를 참조하여 셀렉트 쿼리문을 날리고 출력이 되면 바로 DB에 연결이 되는거죠. 필자는 주 서버를 바로 죽여서 스탠바이 서버가 주서버로 변경되고 난후 다시 사이트 접속을 해봤습니다. IP접속 활성화 상태가 바로 Partner B서버로 넘어가는게 보였습니다. 클러스터보다 더 빨리 쉽게 넘어간걸 보고 너무 놀라웠습니다만 다시 원래 주서버로 원복을 시켰을때는 DB서버에 연결이 되지 않았습니다. 즉 웹서비스라면 재시작을 해줘야만 연결이 가능했죠. 한번 Failover는 가능했지만 두번 다시 Failover 는 되지 않았습니다. 어플리케이션 단에서 DB 접속 Retry 옵션이 있어야만 가능하다는 말을 들었지만 클러스터처럼 VIP를 바라보는게 아니기 때문에 이부분에 대해서는 많은 연구와 테스트가 필요하다는 결론을 내려봅니다. 위그림처럼 DB미러링은 데이터의 완전성을 위한것이지 서비스의 완전성을 위한건 아니라는 결론입니다. 장애 대책을 임시나마 이용하면 더더욱 좋은 기능이지만 이걸 주목적으로 사용하다간 위험하다는거죠.

대부분의 데이타베이스 관리나 운영자들이 미러링 기능을 사용하지 않는거 같습니다. 전략적으로 좋은 기능인거 같다는 생각을 해봅니다만 비용상 효율적인 DB관리 솔루션은 미러링이 짱이다?라는 글을 남겨봅니다.

2010/02/28 03:40 2010/02/28 03:40