사용자 생성 및 DB 할당

데이터베이스/MySQL 2007/09/01 23:09 posted by zekill
사용자 생성 & 사용자에게 DB할당
shell> mysql --user=root -p mysql

mysql> INSERT INTO user VALUES(\'localhost\',\'사용자\',PASSWORD(\'비밀번호\'),\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');
mysql> INSERT INTO user VALUES(\'%\',\'사용자\',PASSWORD(\'비밀번호\'),\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');

mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES (\'localhost\',\'DB명\',\'사용자\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES(\'%\',\'DB명\',\'사용자\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');

mysql> FLUSH PRIVILEGES; (or shell prompt: mysqladmin -u root -pxxxx reload)
2007/09/01 23:09 2007/09/01 23:09

MySQL 간단한 사용법(?)

데이터베이스/MySQL 2007/09/01 23:08 posted by zekill
DB생성
mysql> create database DB명
or 쉘프롬프트상에서
% mysqladmin -u root -p create DB명

DB삭제
mysql> drop database DB명

MySQL 연결
mysql -u 사용자 -p DB명
or 쉘프롬프트상에서
% mysqladmin -u root -p drop DB명

질의파일 실행
mysql>load data local infile \"질의파일\" into table 테이블명 ;
질의파일에서 컬럼구분은 탭문자, Null값은 /n로 입력

or 쉘프롬프트상에서
mysql -u 사용자 -p DB명 < 질의파일

쉘프롬프트상에서 질의 실행
[user@localhsot test] mysql mysql -u root -p xxxx -e \\
> \"INSERT INTO db VALUES(
> \'localhost\', \'aaa\', \'aaa\',
> \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\')\"


DB, 테이블목록보기
mysql> show databases;
mysql> show tables;

사용 DB선택
mysql> use DB명

테이블구조
mysql> describe 테이블명

접속
mysql {-h 접속호스트} -u 사용자 -p 사용DB
-h로 다른 서버에 존재하는 MySQL접속시 다음과 같이 MySQL DB에 설정해줘야 한다.
mysql> INSERT INTO user VALUES(\'접근을 허용할 호스트ip\',\'사용자\',PASSWORD(\'비밀번호\'),\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES(\'접근을 허용할 호스트ip\',\'사용DB\',\'사용자\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');
mysql> FLUSH PRIVILEGES; or 쉴프롬프트상에서 % mysqladmin -u root -p flush-privileges

버전체크
mysql> select version();


검색조건(where)
regular expression을 지원하다니 신기하군..
mysql> select * from work where 열명 regexp \"정규표현식\";

컬럼의 추가, 삭제(오라클과 동일)
alter table 테이블명 add 컬럼명 데이터타입;
alter table 테이블명 del 컬럼명;
2007/09/01 23:08 2007/09/01 23:08

MySQL 루트 암호 변경

데이터베이스/MySQL 2007/09/01 23:06 posted by zekill
물론 디비에 직접 접속하여 변경도 가능하지만... 어드민툴로도 가능하다...
뭐 편한대로...
위는 로컬 아래는 리모트

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
This is done with:
/usr/bin/mysqladmin -u root -p password \'new-password\'
/usr/bin/mysqladmin -u root -h domain -p password \'new-password\'
2007/09/01 23:06 2007/09/01 23:06
예전에 dbakorea.pe.kr 에서 퍼온듯 한데.....지금은 사이트가 존재하지않는것인지....이상한사이트로 연결이..ㅡㅡ;;

======================================

쉘에서는 mysql이 되는데 PHP에서 mysql.sock error를 내면서 MySQL이 안되는 경우
mysql.sock은 /tmp 아니면 /var/lib/mysql에 생기게 된다.
나의 경우, /var/lib/mysql에 mysql.sock파일이 있는데 PHP에서는 /tmp에서 찾으려하면서 에러를 발생했다.
/usr/bin/safe_mysqld파일에서 다음과 같이 수정한다.
주석(#)이 달린 것이 원래것이고 그 밑에 있는것이 수정한 것이다.

# MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/var/lib/mysql/mysql.sock}
MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/tmp/mysql.sock}

위와 같이 하니 /usr/bin/mysql이 /var/lib/mysql/mysql.sock에서 소켓파일을 찾으려 했다.
socket file을 지정하는 --socket이라는 옵션으로 다음과 같이 지정하면 된다.

mysql --socket=/tmp/mysql.sock -u dbakorea -p db_test

하지만 mysql실행시마다 이렇게 써줘야한다는 것이 상당히 귀찮다. 옵션이 바로 적용되게 설정하자.
mysql은 설정사항을 다음 3가지 파일에서 검색한다.

/etc/my.cnf global options(MySQL 전체적으로 사용되는 옵션 정의)
mysql-data-dir/my.cnf 특정 DB에 적용되는 option (/var/lib/mysql/my.cnf)
~/.my.cnf 사용자 각각의 설정(\'~\'문자는 사용자의 홈디렉토리는 의미)

/usr/share/mysql디렉토리에 예제가 있으므로 참고한다.
소켓파일의 지정은 다음줄을 넣어주면 된다.

socket = /tmp/mysql.sock


== /etc/my.cnf예 ==
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
2007/09/01 23:06 2007/09/01 23:06
[페이징] 리스트 페이징(6가지) 100만개 테스트 | MS-SQL

다음은 데브피아 이원문 님의 글입니다.

---------------------------------------------------------------------------

제가 어느 페이징이 제일 빠를까.. 고민 하다가.. 테스트로 만들어 보았습니다.
총.. 6가지..입니다..

간단하게 쿼리를 설명해드리겠습니다.

1. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]

  1번 리스트는 이 쿼리 구문을 써서 했고요. 현제 개시물까지 이동을 Rs.Move(이동할수) 로 처리 했습니다.

2. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]    - 1번과 동일

  1번과 쿼리구문은 동이하고요. 레코드셋의 AbsolutePage를 이용해서 페이징을 했습니다.

3. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]

   WHERE [글번호필드] NOT IN (SELECT TOP [제거할 게시물수] [글번호필드] FROM [테이블명])
   예전에 태요 사이트에서 보았던 쿼리 구문입니다.. NOT IN 때문에.. 문제시 되었던 쿼리구문이죠.

4. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]
   WHERE [글번호] IN (SELECT TOP [페이지출력 갯수] [글번호] FROM
   (SELECT TOP [불러올 총 게시물수] [글번호] FROM [테이블 명]) AS A ORDER BY [글번호])
   ORDER BY [글번호] DESC

   이 쿼리 구문은 3번의 쿼리 구문의 문제점을 보완한 구문입니다. NOT IN 대신에 IN을 사용 했습니다.

5. SELECT TOP [페이지 출력갯수] [출력 필드명] FROM [테이블 명]
   WHERE [글번호] <= (SELECT MIN([글번호])
   FROM (SELECT TOP [제거할 게시물수] + 1 [글번호] FROM [테이블명]) AS A)

   5번째 쿼리 구문은 IN, NOT IN이 아닌 출력할 마지막 글번호 바로 앞이 글번호를 찾아서 처리를 해주는
   쿼리 구문입니다.

6. SELECT TOP [페이지 출력갯수] [출력 필드명] FROM [테이블명]
   WHERE [글번호] <= (SELECT MIN([글번호])
   FROM (SELECT TOP [제거할 게시물수] + 1 [글번호]
   FROM [테이블명] WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호]) AS A
   WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호])
   AND [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호]

   6번재 쿼리는.. 글에 인덱스(가칭)라는 필드를 하나 더 추가 해서.. 글 기본 2000개마다 (가변적입니다)
   인덱스를 증가 시켰습니다. 즉 2000개를 하나의 묶음으로 만든것입니다.
   그 인덱스를 기준으로 처리를 해주었습니다.(기본 개념은 영어 사전 입니다 ㅡㅡ;)


위와 같이 간단한 기본 쿼리 구문을 설명? 했습니다.
게시물은 100만개를 넣고 테스트를 했습니다.
테스트 게시판을 보시려면.. 맨위에 각 게시판을 링크를 걸었습니다.
서버가 구려서.. 제대로 될지 모르지만..
제 노트북
(CPU : p4-1.8, RAM : 768Mb, 컴팩 프리자리오 2820AP, 환경 : 윈도우2003 MSSQL2000)
에서 테스트 해본 봐로는 처음페이지(1), 마지막 페이지(50000) 처리 시간이 아래와 같습니다.(단위 ms)

1 : 320    12289.06
2 : 273    11476.56
3 : 289    4406.25
4 : 289    2695.31
5 : 289    1218.75
6 : 7.81    23.44

엄청난 차이가 나죠??
기본적으로 글번호에 Clustered Index, 인덱스번호, 글깊이에 Non Clustered Index를 걸어 두었습니다.
엄청난 차이로 인해 테스트로 만든 저 또한 입이 쩍 벌어 집니다 ㅡㅡ;;
2007/09/01 23:05 2007/09/01 23:05