서버 점검하던중 뭔가 설정이 초기화 됬는지,

갑자기 서버 관리자 페이지에서 쿼리가 먹히지 않더군요.   (사용자 'x맨'이(가) 로그인 하지 못했습니다)

 

먼저 서비스 DB에 연결 되어있는건 확인됬고,

다음 게임 컨텐츠 DB에 연결 하려고, 안의 프로시저를 실행해본 결과, 특정 DB에만 접속을 못하고 아래의 에러가 나왔습니다.

"메시지 18456, 수준 14, 상태 1, 서버 <computer_name>, 줄 1"

"사용자 '<user_name>'이(가) 로그인하지 못했습니다."

"메시지 4064, 수준 16, 상태 1,"

사용자 기본 데이터베이스를 열 수 없습니다. 

 

 

결국, 이 얘긴 해당 DB에서 상대쪽 DB에 접근이 안된다는 의미이고,

msdn 의 http://support.microsoft.com/kb/307864/ko 의 도움말을 살펴본 결과

 

상대쪽 DB 보안 -> 로그인 -> 해당 계정의 기본 DB지정에 문제가 있음을 알게 되었습니다.

 

 

결국... 기본 DB를 연결해 주려는 DB로 설정하니 말끔이 해결...

 

... 알고나면 허망한 sql 세계 ㅠㅠ

출처 : http://tistory.kkwang.com/161

 

 

mssql은 복구를 위해 실제데이터(확장자 mdf)와 트랜잭션로그데이터(확장자 ldf)를 기록합니다.

mdf는 말그대로 디비에 저장되는 실데이터를 말하며, ldf는 트랜잭션로그, 즉 이러한 데이터를 이용한 읽기, 수정, 삭제등의 모든 로그를 기록합니다.

그래서 특정데이터에 대해 입출력이나 업데이트가 반복되는 경우 비정상적으로 ldf파일이 커지는 경우가 발생하게 됩니다. 이러한 일은 정상적인 억세스로 일어날 수도 있으나 잘못된 프로그래밍 또는 오류로 인한 무한루프에 의해 급증하는 경우도 발생하게 됩니다.

 

하드디스크가 매우 여유롭다면 몰라도 이런일로 하디디스크 풀이 나는 장애가 발생된다면 정말 난감해집니다.

사실 ldf파일이 없이도 mdf만으로 디비를 복구하는 방법도 있습니다만 제대로? MS의 정책에 따라 완벽한 복구를 위해서 ldf를 버리지 말고 용량을 잘 조절해서 사용하는 방법을 말씀 드리겠습니다.

 

일단 EM환경보다는 제가 사용하기 편리한 쿼리분석기에서의 작업을 기준으로 설명 드리겠습니다.

일단 쿼리분석기를 실행합니다.

 

### 트랜잭션로그를 백업할 디비를 지정하여 줍니다.

use testdb  — 저는 testDB를 지정한다고 가정하였습니다.

 

### 로그파일의 정보를 확인합니다.

dbcc loginfo

 

### 현재 지정된 디비가 사용하는 mdf 및 ldf파일의 경로, 이름 및 크기를 확인합니다.

exec sp_helpfile

 

### 위에서 정해준 디비의 로그를 백업해 줍니다.

backup Log testdb to disk=’d:\dbbackup\temp\testdb.bak’

go

 

선택 1, ### 트랜잭션 로그파일을 최소의 단위로 축소합니다.

backup log testdb with truncate_only

 

선택 2, ### 트랜잭션 로그파일을 삭제합니다.

backup log testdb with no_log

 

### 트랜잭션 로그파일을 10메가로 생성합니다.

dbcc shrinkfile (testdb_log, 10)

 

### mdf와 ldf파일이 제대로 잘 리사이징 되었는지 확인합니다.

exec sp_helpfile

 

모든 작업이 잘 마무리 되었다면, 이제는 갑작스런 트랜잭션로그의 증가로 문제가 되는 것을 방지하기 위해
트랜잭션로그파일의 최대크기를 지정해놓는 방법도 좋습니다.

alter database testdb

modify file ( name = testdb_log, maxsize = 200 mb )

go

 

위 의 과정을 진행하시면 트랜잭션로그는 위에서 지정한데로 200메가를 한계치로 생성 삭제 됩니다.
트랜잭션로그의 용량은 데이터의 중요도 및 규모에 따라 정책적으로 유지하셔야 하는 부분입니다.
200메가는 예제로 적어놓은 사이즈입니다.

또한 위의 과정 중 축소와 삭제는 둘 중 원하시는 방법을 선택적으로 사용하시면 됩니다.

 

////////////////////////////////////////////////////////////////////////////////////////

 

추가적으로 하다가 트랜잭션 로그 파일을 10메가로 생성할때,

메시지 8985, 수준 16, 상태 1, 줄 1
sys.database_files에서 데이터베이스 'testdb'의 파일 'testdbLog'을(를) 찾을 수 없습니다. 파일이 없거나 삭제되었습니다.

 

메시지가 발생되어 에러가 났었지만,

select * from sys.database_files 

쿼리를 실행시킨후 나온 DB이름을 대입하니 문제없이 실행 되었습니다.

 

DB를 다른 컴으로 옮길일 이 있어서, 백업을 받은 다음, 그 파일을 다른 컴퓨터에서 복원을 시키려 하는데...

 

같은 이름의 데이터베이스 이름을 만들고, 복원시 덮어 써버리는 옵션을 이용해서 해보려니 가끔

 

restore database is terminating abnormally ... SQL error 3154

 

하면서 실행이 안됬다...

 

뭔가 지웠다 다시 하라니 글들을 실험해 봤지만.. 영...

 

그러다 해외 사이트에서 발견한 아주 간단한 방법..

 

Backup File = mydatabase.bak

 

1. Run Microsoft SQL Server Management Studio application.

2. If mydatabase is in Databases : delete mydatabase.

3. Right Click to Databases and select Restore Database ....

4.    Destination for restore -> To database: mydatabase

       Source for restore -> select From device -> Specify the backup media and select the backup sets to restore

       Select Options from Select a page and in Restore the database file as: type the fullpath for the mydatabase new location

(for initdb_Data line with .mdf extension and for initdb_Log line with .ldf extension 

ex.:

C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\mydatabase.mdf

C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\mydatabase.ldf).

 

5. Press OK button.

 

Have fun!

 

form Ramidava , in http://social.msdn.microsoft.com/Forums/en-US/sqldisasterrecovery/thread/d315d8f4-d7e2-4197-9cbb-4cbe086af33e

 

 

ㅡ_ㅡ.... 오전동안 뻘짓한 시간이.. ㅠㅠ

출처 : http://youngsam.kr/696

 

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'

EXEC sp_MSForEachTable 'DELETE FROM ?'

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'

 

하지만, 그대로 사용하기엔 좀 부족해 보인다.

아래 사항을 추가해서 사용해야겠다.

1.     삭제하지 않을 테이블을 지정할 수 있을 것.

2.     DELETE문 대신 TRUNCATE TABLE문을 사용할 수 있다면… TRUNCATE TABLE문을 쓰도록 분기할 것. (테이블이 VIEWschema binding되어 있다면… DELETE문을 쓸 수 없을 듯)

3.     IDENTITY 속성의 컬럼을 포함한 경우, Reseed 할 것.
이때, 한번도 데이터가 INSERT되지 않았거나 TRUNCATE한 테이블과그렇지 않은 테이블의 Reseed 값을 달리 적용해야 함에 유의!!!



 


EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'
한줄 테이블 삭제
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
외래키 제약조건 무시, 세줄 테이블 삭제


서버 개발하다 보면 DB에 내장 프로시저가 많아지는데
이것도 나중에 관리하는게 일이 되어 버린다.

하여튼, 특정 단어가 쓰였는지 확인하려면

--내장 프로시저 검색
SELECT * FROM sysobjects WHERE id IN (
 SELECT id FROM syscomments WHERE text LIKE '%검색할 단어%'
)

위 쿼리를 실행시키면 된다.

그대로 복사해서 검색할 단어에 프로시저에서 사용할법한
(SELECT 나 UPDATE 등 테이블 조작하는 필드명을 검색한다거나...)
단어를 넣어서 실행하면
결과 테이블이 뜨는데, 그 내장 프로시저를 찾아가면 된다.

+ Recent posts