DBMS 2
DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!
데이터 베이스 디렉토리에 있는 테이블과 데이터 베이스는 다른 위치로 이동 시킨 후에 새로운 위치를 가리키는 심볼릭 링크로 대체 시킬 수가 있다. 이렇게 하기 위한 권장 방법은 데이터 베이스를 다른 디스크로 간단히 심링크 (symlink)시키는 것이다. 유닉스에서 데이터 베이스를 심링크 시키는 방법은 우선 여유 공간이 있는 디스크에 디렉토리를 하나 만들고 MySQL 데이터 디렉토리에서 이곳으로 심링크를 생성하는 것이다. MySQL은 하나의 디렉토리에서 여러 개의 데이터 베이스로 링크 시키는 것을 지원하지 않는다. 데이터 디렉토리를 하나의 심볼릭 링크로 대체 시키면 데이터 베이스 간에 심볼릭 링크를 만들지 않는 한 올바로 동작을 한다. MySQL이 데이터 디렉토리 밑에 데이터 베이스 db1 를 가지고 있다고 가정하고, 그 다음에 심링크 db2를 만들어서 db1를 가리키도록 만들어 본다: 그 결과, db1 안에 뿐만 아니라, db2에도 테이블 tbl_a가 나타난다. 만일 한 클라이언트가 db1.tbl_a 를 업데이트하고 다른 클라이언트가 db2.tbl_a를 업데이트 한다면, 문제가 발생될 수 있다. 하지만, 만일 여러분이 정말로 이렇게 실행하고자 하다면, mysys/my_symlink.c의 소스 파일을 수정하면 되는데, 아래의 명령문을 잘 살펴 보기 바란다: 위의 것을 아래와 같이 수정한다: realpath() 호출을 완벽하게 실행하지 못하는 시스템에서는 테이블을 심링크 시킬 수가 없다. (리눅스 및 솔라리스는 realpath()를 지원함). 여러분은 SHOW VARIABLES LIKE 'have_symlink' 명령문을 사용해서 지금 사용하고 있는 시스템이 심볼릭 링크를 지원하는지를 검사해 볼 수가 있다. 심링크는 MyISAM 테이블에 대해서만 전적으로 지원한다. 다른 스토리지 엔진을 위한 테이블이 사용하는 파일에 대해서 심볼릭 링크를 사용한다면 예상하지 못한 문제가 나올 수도 있다. MyISAM 테이블을 위한 심볼릭 링크는 다음과 같이 처리가 된다: 테이블 심링크 연산은 아직까지는 지원하지 않는다: 심볼릭 링크는 모든 윈도우 서버에 대해서 디폴트로 활성화 되어 있다. 이것은 여러분이 서로 다른 디스크에 있는 데이터 베이스 디렉토리를 가져 올 수 있도록 해 준다. 이것은 유닉스에서의 데이터 베이스 심볼릭 링크가 동작하는 방식과 유사하지만, 링크 설정 과정은 다르다. 만일 심볼릭 링크가 필요 없다면, --skip-symbolic-links 옵션을 사용해서 이것을 비 활성화 시키면 된다. 윈도우에서는 목적 디렉토리 경로를 가지고 있는 데이터 디렉토리에 파일을 하나 생성함으로써 MySQL에 대한 심볼릭 링크를 만든다. 이 파일은 db_name.sym이라는 이름이 되어야 하고, 여기에서 db_name는 데이터 베이스의 이름이 된다. MySQL 데이터 디렉토리가 C:\mysql\data이고 D:\data\foo에 데이터 베이스 foo가 있도록 한다고 가정하자. 이에 대한 심볼릭 링크는 다음과 같이 만들어 진다: 이렇게 하면, 데이터 베이스 foo에서 생성된 모든 테이블은 D:\data\foo안에서 생성된다.디스크 이슈
디스크 이슈
심볼릭 링크 사용하기
MyISAM 테이블의 경우, 인덱스 파일과 데이터 파일이 일반적으로 저장되어 있는 데이터 디렉토리를 다른 디스크로 심볼릭 링크 시킨다. 이렇게 하면 디스크 검색 및 데이터 읽기 시간을 보다 개선 시킬 수 있다.
스트라이핑이란, 여러분이 디스크를 많이 가지고 있고, 첫 번째 블럭은 첫 번째 디스크에 올려 놓고, 두 번째 블럭을 두 번째 디스크에, 세 번째는 세 번째 디스크에, 그리고 N 번째 블럭은 (N MOD 디스크 번호) 디스크에 놓는 것을 의미한다. 만일 일반적인 데이터의 크기가 스트라이프 크기보다 작다면 (또는 정확히 같다면), 보다 좋은 성능을 얻을 수가 있다. 스트라이핑은 OS 및 스트라이프 크기에 매우 밀접하기 때문에, 여러분이 사용하는 어플리케이션을 서로 다른 스트라이프 크기로 벤치 마크를 해보기 바란다. 스트라이핑의 속도 차이는 파라미터와 매우 밀접한 관련이 있다. 스트라이핑 파라미터와 디스크 숫자를 어떻게 설정하느냐에 따라서 전체적인 차이를 가지게 된다.
hdparm -m 16 -d 1 이때 성능 향상과 안정성은 여러분이 사용하는 시스템의 하드웨어와 매우 밀접하게 된다.
만일 파일이 언제 최종적으로 접속이 되었는지 알 필요가 없다면 (실제로 데이터 베이스 서버에서는 필요 없는 사항임), 여러분이 사용하는 파일 시스템을 -o noatime 옵션을 사용해서 마운트 한다. 이렇게 하면 파일 시스템에 있는 아이노드 (inode)에 최종 접속 시간을 업데이트 하지 않게 되며, 이에 따라서 디스크 검색 시간을 절약 시킬 수가 있다. 대부분의 OS에서, 여러분은 파일 시스템을 -o async 옵션과 함께 마운트 시킴으로써 비 동기적인 업데이트가 되도록 만들 수가 있다. 이렇게 하면, 보다 개선된 성능을 얻어낼 수가 있다. (리눅스에서는 이 플래그가 디폴트임)심볼릭 링크 사용하기
유닉스에 있는 데이터 베이스에 대한 심볼릭 링크 사용하기
유닉스에 있는 테이블에 대한 심볼릭 링크 사용하기
윈도우에 있는 데이터 베이스에 대한 심볼릭 링크 사용하기
유닉스에 있는 데이터 베이스에 대한 심볼릭 링크 사용하기
hell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test /path/to/datadir
shell> cd /path/to/datadir
shell> ln -s db1 db2
if (!(MyFlags & MY_RESOLVE_LINK) ||
(!lstat(filename,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
if (1)
유닉스에 있는 테이블에 대한 심볼릭 링크 사용하기
shell> cd /path/to/datadir/db1
하나의 쓰레드가 db1.tbl1을 읽고 다른 쓰레드가 db1.tbl2를 업데이트 한다면 문제가 발생한다:
shell> ln -s tbl1.frm tbl2.frm
shell> ln -s tbl1.MYD tbl2.MYD
shell> ln -s tbl1.MYI tbl2.MYI
윈도우에 있는 데이터 베이스에 대한 심볼릭 링크 사용하기