Posts tagged ‘database’

Cassandra database

많은 Apache 프로젝트 중 하나
Facebook이 사용하고 있고 (라기보단 저기서 부터 시작 되었고) 최근에 Twitter도 사용하기로 했다라는 환상의(?) DB

아직 잘 안써봐서 모르겠지만.. 첫 느낌은..

‘자바를 이용한 배열+배열의 인덱싱’

문서도 안 읽어보고 그냥 내 맘대로 깔고 실행해본 결과의 느낌임 ㅎ
내심 나중에 이 글을 보면서 땅을 치며 후회하길 살짝은 바라고 있기도 함;;

자세한 소감은 좀 써본 다음에 이어서 🙂

테이블 Row수가 궁금하다면??

1. 일일이 카운트 한다 – 정확도 100%
2. System table 에 저장되어있는 row count 를 참조 한다 – 정확도 1번과 비교하면 약간 떨어짐

물론 정확해야한다면 1번으로..
다만.. 데이터의 증감 또는 분위기 파악 정도로 할 때에 테이블 한 두개면 모를까.. 많으면 1번의 경우 토나오는 작업이 되는 것이 현실..

그래서 2번을 사용하는 경우가 있는데.. 이 때 사용하는 쿼리

——————————————
select    B.name, A.rowcnt
from    sysindexes AS A with (nolock)
    JOIN sys.tables as B with (nolock)
    ON A.id = B.[object_id] and A.indid < 2
order by [name] asc
——————————————

시스템 테이블에 저장되어있는 row count와 table 이름을 조합하여 테이블의 row 갯수를 반환 받을 수 있음..

가끔은 편리함 🙂

SQL 2008 Service pack1 이 나왔습니다~

물론 몇 일 전에-_-;;

요즘 이것저것 손볼게 많아지면서 개인적인 시간이 완전 사라져버렸는데 그나마 오늘은 중간중간 짬이라도 좀 나네 🙂
SQL 2008을 사용 하시고 있다라면 필수로 업데이트를 해야하는 서비스 팩이 나왔습니다
다운로드는
이곳에서
물론 전 아직 설치하지 않았습니다
[……]
아 지겹다 -_-;

MSSQL Mirroring 구현하기 – MSSQL 미러링, FQDN 에러 해결 방법

SQL 2005 가 발표되면서 가장 마음에 들었던 기능중 하나인 Mirroring 을 구현함에 있어서 서버들의 환경이 도메인으로 묶여있는 환경이 아니라면 (보통의 경우는 묶여있는 경우가 드물듯..;; ) 설정을 할 때 이런저런 에러 사항이 꽃을 피게 되는데 대표적인 예가 FQDN (Fully Qualified Domain Name) 을 운운 하면서 에러를 내보내는 경우가 대부분 이라는 것..

이를 해결 하기 위해서는 모든 서버들은 도메인으로 – 액티브디렉토리를 사용하여 도메인 구조로 묶게 되면 해결이 되지만 DBMS하나 깔아서 쓰는 것도 귀찮고 힘들어 죽겠는데 액티브 디렉토리까지 신경쓰기 싫을 경우에 나름의 꼼수로 ㅎ 쓸 수 있는 방법..

나도 IDC에 액티브 디렉토리의 설정을 들여놓긴 싫어서 같은 방법을 쓰고 있으며 뭐 잘 돌아가니 🙂

OS 는 Windows server 2003 이상이면 되고 DBMS는 SQL 2005 이상이면 동작한다
다만 SQL 2005의 서비스팩은 반드시 적용하시길~ SQL 2005의 경우 현재(2009/01/30) SP3 까지 나와있으니 download 페이지에서 받으시면 준비는 끝날듯~

미러링을 위해서는 총 세개의 인스턴스가 설치가 되어있으면 되며 물리적으로 분리가 되어있어도 되며 그게 아니라면 추가 인스턴스로 되어있어도 동작하는데는 문제가 없음..

이제 작업 리스트
내 경우에는 총 3대의 서버에서 진행을 했으며 마스터DB와 미러DB는 SQL 2005 Standard edition 그리고 감시용으로는 SQL 2005 express edition을 사용했음

1. Host file의 수정
172.10.10.10       db1.database.server.hugyou.net
172.10.10.11       db2.database.server.hugyou.net
172.10.10.12       db3.database.server.hugyou.net

뒤에 도메인 네임은 쓰고 싶으신 걸로 🙂 dbserver1.google.com 이라고 해도 상관없음 -_-;;

2. Full backup & Transaction log backup
마스터 DB에서 하나의 Full backup 그리고 그 이후에 생성된 Transaction log backup 을 생성한 후 해당 백업 파일을 미러DB에 복사해놓음

3. 2번에서 생성된 백업 파일을 복원
복원을 할 때 with nocovery 옵션으로 DB를 열어놓은 상태로 만들어 놓는다

4. DB서버 별 인증서 파일 생성
— 마스터DB
create master key encryption by password = ‘마스터DB 비밀번호’;
GO

create certificate DATABASE_A_Cert with subject = ‘DATABASE A Certificate’, start_date = ‘2009/01/01’, expiry_date = ‘2020/12/31’;
GO

Create endpoint endpoint_mirroring state = started
as tcp(listener_port = 7123, listener_ip = all)
for database_mirroring (authentication = certificate DATABASE_A_Cert, encryption = REQUIRED, role = all);
GO

Backup certificate DATABASE_A_Cert to file = ‘c:\DATABASE_A_Cert.cer’;
GO

— 미러DB
create master key encryption by password = ‘미러DB 비밀번호’;
GO

create certificate DATABASE_B_Cert with subject = ‘DATABASE B Certificate’, start_date = ‘2009/01/01’, expiry_date = ‘2020/12/31’;
GO

Create endpoint endpoint_mirroring state = started
as tcp(listener_port = 7123, listener_ip = all)
for database_mirroring (authentication = certificate DATABASE_B_Cert, encryption = REQUIRED, role = all);
GO

Backup certificate DATABASE_B_Cert to file = ‘c:\DATABASE_B_Cert.cer’;
GO

— 감시DB
create master key encryption by password = ‘감시DB 비밀번호’;
GO

create certificate DATABASE_C_Cert with subject = ‘HOST_W certificate’, start_date = ‘2009/01/01’, expiry_date = ‘2020/12/31’;
GO

Create endpoint endpoint_mirroring state = started
as tcp(listener_port = 7123, listener_ip = all)
for database_mirroring (authentication = certificate DATABASE_C_Cert, encryption = REQUIRED, role = witness);
GO

Backup certificate DATABASE_C_Cert to file = ‘c:\DATABASE_C_Cert.cer’;
GO

인증서 생성시 유효 기간은 알아서 적당하게 진행하면 되며 내 경우에는 다시 설정하기 귀찮으니–;; 10년정도 뒤로 -ㅅ-;; 설마 2020년까지 이 시스템을 사용하지는 않겠지 ㅎ

5. 생성된 인증서 파일을 각 서버에 전부 카피 한다
서버는 다른 두 서버에서 생성된 인증서를 가지고 있어야 함

6. 로그인 계정 생성 및 Endpoint 설정 – 가장 긴 부분 🙂
— 마스터DB
create login DATABASE_B_login with PASSWORD = ‘미러DB 로그인 암호’;
GO

create user DATABASE_B_user from login DATABASE_B_login;
GO

Create certificate DATABASE_B_Cert
Authorization DATABASE_B_user
From file = ‘c:\DATABASE_B_Cert.cer’;
GO

Grant CONNECT ON Endpoint::endpoint_mirroring to [DATABASE_B_login];
GO
——
create login DATABASE_C_login with PASSWORD = ‘감시DB 로그인 암호’;
GO

create user DATABASE_C_user from login DATABASE_C_login;
GO

Create certificate DATABASE_C_Cert
Authorization DATABASE_C_user
From file = ‘c:\DATABASE_C_Cert.cer’;
GO

Grant CONNECT ON Endpoint::endpoint_mirroring to [DATABASE_C_login];
GO

— 미러DB
create login DATABASE_A_login with PASSWORD = ‘마스터DB 로그인 암호’;
GO

create user DATABASE_A_user from login DATABASE_A_login;
GO

Create certificate DATABASE_A_Cert
Authorization DATABASE_A_user
From file = ‘c:\DATABASE_A_Cert.cer’;
GO

Grant CONNECT ON Endpoint::Endpoint_mirroring to [DATABASE_A_login];
GO

——-
create login DATABASE_C_login with PASSWORD = ‘감시DB 로그인 암호’;
GO

create user DATABASE_C_user from login DATABASE_C_login;
GO

Create certificate DATABASE_C_Cert
Authorization DATABASE_C_user
From file = ‘c:\DATABASE_C_Cert.cer’;
GO

Grant CONNECT ON Endpoint::Endpoint_mirroring to [DATABASE_C_login];
GO

— 감시DB
create login DATABASE_A_login with PASSWORD = ‘마스터DB 로그인 암호’;
GO

create user DATABASE_A_user from login DATABASE_A_login;
GO

Create certificate DATABASE_A_Cert
Authorization DATABASE_A_user
From file = ‘c:\DATABASE_A_Cert.cer’;
GO

Grant CONNECT ON Endpoint::Endpoint_mirroring to [DATABASE_A_login];
GO

——-
create login DATABASE_B_login with PASSWORD = ‘미러DB 로그인 암호’;
GO

create user DATABASE_B_user from login DATABASE_B_login;
GO

Create certificate DATABASE_B_Cert
Authorization DATABASE_B_user
From file = ‘c:\DATABASE_B_Cert.cer’;
GO

Grant CONNECT ON Endpoint::endpoint_mirroring to [DATABASE_B_login];
GO

7. 미러링 설정 하기
— 미러DB
alter database [DB이름] set partner = ‘TCP://db1.database.hugyou.net:7123’;
GO

— 마스터DB
alter database [DB이름] set partner = ‘TCP://db2.database.hugyou.net:7123’;
GO

alter database [DB이름] set witness = ‘TCP://db3.database.hugyou.net:7123’;
GO

이걸로 미러링 끝~ 🙂 뭐 오타 있을 수 있지만 그건 그 때 알아서 고치면 될 것 같고;;
이제 도메인 걱정없는 미러링을 즐겨봅시다~

마스터가 죽으면 자동으로 미러로 서비스가 옮겨지지만 ip 주소가 다를 경우 어플리케이션 들은 DB가 변경이 되었는지 알길이 없으니 연결을 시도해보고 마스터가 죽었으면 미러로 접속을 하는 설정을 해놓으면 마스터DB의 시간을 벌 수 있을듯~

MySQL 에서 LOAD DATA INFILE 과정을 web에서 처리 할 때 필요한 권한

php등에서 리눅스 서버로 업로드 하고 나면 보통 /tmp 디렉토리에 올라가는데 해당 파일에서 MySQL로 LOAD DATA INFILE을 시도 할 경우 에러가 나게 될 가능성이 있으니 혹시라도.. 업로드 파일을 바로 사용할 경우에는 DB 사용자의 권한을 체크!
use mysql;
select * from user;
하면 유저들 정보가 주욱 다 나오는데 해당 권한들 중에서 import시 사용되는 유저의 file_priv 의 권한을 Y로 바꾸고 flush를 합시다 🙂

MSSQL 에서 MySql 데이터를 조회해야할 일이 있을때 – OPENQUERY 사용예시..

오늘 간만에 한번 실무에서 써봤으니 까먹지 않게 정리 한판..

MSSQL이 깔려있는 서버 컴퓨터에 MySql connecter/ODBC 를 깐다.. 최근 버전은 5.1임..
(많은 자료들이 아마도 3.51 로 되어있는 경우가 많을듯)
MySql ODBC 드라이버를 깐 후 Linked Server를 ODBC를 이용하여 잡아줌
그후 쿼리 날리기
select * from openquery(MYSQL, ‘select * from TABLE limit 100’)
INSERT into openquery(MYSQL,’select fd1, fd2, fd3 from TABLE’)
select va1, va2, va3
from source.table
or 
INSERT into openquery(MYSQL,’select fd1, fd2, fd3 from TABLE’)
values (va1, va2, va3)
내 경우에는 Linked Server의 이름을 MYSQL 로 잡았기에 위처럼 쿼리를 날리면 된다라는..

MySQL – 텍스트, CSV 등의 Flatfile을 import 할 때 쓰는 명령어

작업 하다보면 txt파일 또는 csv등의 파일들을 DB에 넣어야 할 경우가 많은데 phpmyadmin 을 쓰지 않는 이상 쿼리로 모든 것을 해야하니 이번에 작업 하나 한 김에 또 잊기전에-_- 기록 남겨놓기 🙂

쿼리를 이렇게 날립시다
mysql > LOAD DATA INFILE ‘/경로/파일이름.txt’ INTO TABLE ‘테이블’ FIELDS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’ (필드1, 필드2);

이렇게 하면 /경로/파일이름.txt가 ‘테이블’ 이라는 이름의 테이블로 입력 되는데 필드1, 필드2 라는 이름의 필드들에 해당 값이 import 됨

에러가 나와도 진행을 하기 위해서 필드 뒤에 IGNORE 1 LINES  명령어를 넣어주면 됨

작업 좀 편하게 합시다~ 🙂
mysql 로그인 도 귀찮은 경우에는

$> mysql -uroot -p -e “LOAD DATA INFILE ‘/경로/파일이름.txt’ INTO TABLE ‘테이블’ FIELDS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’ (필드1, 필드2);”

이렇게 처리를 해주면 로그인을 한 화면에서 다시 붙여넣기를 하지 않아도 자알 들어감..

MySQL 변경해도 변경이 안될 경우 -_-;;; flush privileges

제목이 이상하지만 MySQL을 쓰다보면 사용자를 추가 했는데 로그인이 안된다거나 패스워드를 변경했는데 변경되지 않은 것으로 나올 때가 있는데 이 때 사용하면 대부분의 경우 해소가 되는 명령어가

flush privileges;

root로 로그인 한 다음에 저거 한번 해주면 모든 변경 사항이 싸악 적용되면서 원치 않던 에러가 많이 해결되리라 생각됨 🙂

많이 착한 명령어중 하나임~