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

Posted
Filed under Study

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
Posted
Filed under Study

SQL SERVER 2005 uses ALTER INDEX syntax to reindex database. SQL SERVER 2005 supports DBREINDEX but it will be deprecated in future versions.

When any data modification operations (INSERT, UPDATE, or DELETE statements) table fragmentation can occur. DBCC DBREINDEX statement can be used to rebuild all the indexes on all the tables in database. DBCC DBREINDEX is efficient over dropping and recreating indexes.

Execution of Stored Procedure sp_updatestats at the end of the Indexes process ensures updating stats of the database.

Method 1: My Preference

USE MyDatabase
GO
EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)"
GO
EXEC sp_updatestats
GO

Method 2:

USE MyDatabase
GO
CREATE PROCEDURE spUtil_ReIndexDatabase_UpdateStats
AS
DECLARE
@MyTable VARCHAR(255)
DECLARE myCursor
CURSOR FOR
SELECT
table_name
FROM information_schema.tables
WHERE table_type = 'base table'
OPEN myCursor
FETCH NEXT
FROM myCursor INTO @MyTable
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT
'Reindexing Table:  ' + @MyTable
DBCC DBREINDEX(@MyTable, '', 80)
FETCH NEXT
FROM myCursor INTO @MyTable
END
CLOSE
myCursor
DEALLOCATE myCursor
EXEC sp_updatestats
GO


SQL설치되고 나서 아무것도 모르면 시간이 흐르면 괜히 DB가 느려진다. 위와 같은 리인덱스 쿼리문을 작업배치로 돌려주면 간간히 부하가 걸리는 DB서버를 원할이 유지하는데 도움을 주기 때문에 블로그에 여기 남겨본다.
2009/12/05 01:40 2009/12/05 01:40