MYSQL / R

쿼리 사용방법

페이지 정보

profile_image
작성자 최고관리자 작성일 10-03-30 10:07 조회 1,621 댓글 0

본문

MySQL 실행과 종료
- MySQL 실행
사용형식 : /usr/local/mysql/bin/mysqld_safe [각종 옵션들] &
- MySQL 종료
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p shutdown

* MySQL 기본관리
- MySQL 접속
사용형식 : /usr/local/mysql/bin/mysql -u MySQL_계정명 -p 접속할_데이터베이스명 -h 접속할 호스트이름 -P 접속포트번호 -S /tmp/mysql.sock
          mysql                : MySQL 데이터베이스로 접속하기 위한 MySQL 클라이어트 프로그램
    -u                    : 접속할 MySQL 계정(사용자)명을 지정하기 위한 옵션
    MySQL_계정명          : 데이터베이스로 접속할 MySQL의 사용자(계정)명
    -p                    : 패스워드를 입력하기 위한 옵션(패스워드가 없을 경우에 생략가능함)
    접속할_데이터베이스명 : 접속 후 사요할 데이터베이스명
    -h                    : 접속할 호스트이름
    -P                    : 접속할 포트번호
    -S                    : 접속할 MySQL 소켓파일 위치 지정
# /usr/local/mysql/bin/mysql -u root -p mysql
Enter password: ********
# /usr/local/mysql/bin/mysql -u picasso -p picasso_db
Enter password: ********
# /usr/local/mysql/bin/mysql -u root -p'12345678' mysql
# /usr/local/mysql/bin/mysql -u user -p'11111111' user_db
# /usr/local/mysql/bin/mysql -u ruser -p ruser_db -h 192.168.0.111 -P 3306
Enter password: ********
- 패스워드 재설정
사용형식 : /usr/local/mysql/bin/mysqladmin -u 계정명 password 변경할_패스워드
# /usr/local/mysql/bin/mysqladmin -u root password 12345678 -> 기존에 패스워드가 존재하지 않을 때
Enter password: ********
# /usr/local/mysql/bin/mysqladmin -u root -p password 12345678 -> 기존에 패스워드가 존재할 때
Enter password: ********
# /usr/local/mysql/bin/mysqladmin -u user -p password 11111
Enter password: ********
# /usr/local/mysql/bin -u root -p'12345678' mysql
mysql> update user set password = password('12345678') where user = 'root';
mysql> set password for root = password('2345');
- 쉘상태에서 특정파일에 저장된 SQL문 실행하기
# /usr/local/mysql/bin -u user -p user_db < /home/user/user.sql
Enter password: ********
- 새로운 MySQL 사용자를 위한 MySQL 설정
mysql> create database user_db;
mysql> grant all on user_db.* to user@'localhost' identified by 'password';
## mysql> revoke all on user_db.* from user@'localhost';
## mysql> revoke all on user_db.* from user;
## mysql> delete from mysql.user where user = 'user';

* MySQL 패스워드 복구
1. 실행중인 MySQL을 종료한다.
# ps -ef | grep mysqld
# killall mysqld
2. table grant 권한없이 MySQL을 실행한다.
# /usr/local/mysql/bin/mysqld_safe --skip-grant-table &
3. 패스워드없이 MySQL root 계정으로 MySQL에 접속한다.
# /usr/local/mysql/bin/mysql -u root mysql -> 패스워드 지정 안함
4. UPDATE 문으로 MySQL root사용자의 패스워드를 변경한다.
mysql> update user set password = password('12345678') where user = 'root';
5. "flush privileges"로 MySQL데이터들을 동기화한다.
mysql> flush privileges;
6. MySQL을 빠져나와서 실행했던 MySQL을 종료한다.
# killall mysqld
# /usr/local/mysql/bin/mysqladmin -u root shutdown
7. 일반적인 방법으로 MySQL을 실행한다.
# /usr/local/mysql/bin/mysqld_safe --skip-grant-table &
8. 패스워드를 사용하여 MySQL의 root계정으로 접속하여 확인한다.

* "too many connections" 에러 해결방법
원인: 이에 대한 원인을 설명하기 위해서는 php에서 사용하는 MySQL 연결함수인 mysql_connect()와 mysql_pconnect의 차이점 그리고, mysql_close()함수에 대한 정확한 이해가 필요하다.
      mysql_connect()함수를 이용하여 MySQL에 연결하였다면 해당 스크립트가 종료됨과 동시에 mysql_close()함수를 호출하지 않았다 하더라도 자동으로 연결이 종료된다.
      하지만, mysql_pconnect()함수는 해당 스크립트가 종료된 후 mysql_close()함수가 호출되어도 연결이 끊어지지 않은 채로 계속 연결을 유지하고 있다.
      따라서, 얼핏보기에는 "too many connections"라는 에러메시지는 mysql_pconnect()라는 함수의 사용때문에 발생하는 것 같지만 (물로 그런 이유도 있을 수 있지만) 근본적인 원인은 이와 다를 수 있다.
      결론적으로 "mysqladmin -u -p variables"의 결과로서 볼 수 있었던 MySQL의 환경변수값들 가운데 "wait_timeout"의 값만큼 서버에 그대로 연결을 유지한 채로 남아있는 것이다.
      따라서, 이것이 "too many connections" 에러가 발생하는 긍극적인 원인이 되는 것이다.
      이를 해겨하면 MySQL이 빠른 응답을 할 수 있도록 서버 하드웨어 사양(CPU, 메모리 등)을 높이는 방법도 있겠지만 급하게 조치해야하는 경우에는 MySQL의 필요한 변수의 값을 보다 높게 설정하는 방법이 현명할 것이다.
      "mysqladmin -u root -p variables"라고 하면 MySQL의 전체 환경변수의 값을 확인할 수 있다.
      이들 MySQL 환경변수 가운데 다음 3가지의 값을 현재보다 높게 설정함으로서 "too many connection" 에러를 응급초지할 수 있다.
      - max_connection : MySQL에 connect할 수 있는 최대 개수
      - table_cache    : MySQL의 테이블 캐쉬크기
      - wait_timeout  : MySQL에 connect하여 쿼리를 지속할 수 있는 시간
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep max_connections
      | max_connections                | 100                                  |
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep table_cache
      | table_cache                    | 64                                    |
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep wait_timeout
      | innodb_lock_wait_timeout        | 50                                    |
      | table_lock_wait_timeout        | 50                                    |
      | wait_timeout                    | 28800                                |
      # /usr/local/bin/mysqld_safe -O max_connections=500 -O table_cache=256 -O wait_timeout=57600 &

* MySQL 관리자 전용 유틸리티 mysqladmin
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p 명령어
- 새로운 데이터베이스 생성하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p create 새로운_데이터베이스명
# /usr/local/mysql/bin/mysqladmin -u root -p create user_db2
Enter password: ********
- 특정 데이터베이스 삭제하기
사용형식: /usr/local/mysql/bin/mysqladmin -u root -p drop 삭제할_데이터베이스명
# /usr/local/mysql/bin/mysqladmin -u root -p drop user_db2
Enter password: ********
- MySQL 권한테이블 갱신하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p reload
# /usr/local/mysql/bin/mysqladmin -u root -p reload
Enter password: ********
- MySQL에 접속한 사용자 확인하기
사용형식: /usr/local/mysql/bin/mysqladmin -u root -p processlist
# /usr/local/mysql/bin/mysqladmin -u root -p processlist
- 접속되어 있는 MySQL 사용자(thread) 접속 끊기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p kill 쓰레드번호
# /usr/local/mysql/bin/mysqladmin -u root -p processlist -> 종료시킬 쓰레드 확인
# /usr/local/mysql/bin/mysqladmin -u root -p kill 8  -> Id가 8인 쓰레드 종료
- MySQL의 간단한 실행정보 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p status
# /usr/local/mysql/bin/mysqladmin -u root -p status
Uptime: 2095884  Threads: 12  Questions: 2578614  Slow queries: 0  Opens: 0  Flush tables: 1  Open tables: 138  Queries per second avg: 1.230
- MySQL의 현재 상황 자세히 살펴보기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p extended-status
# /usr/local/mysql/bin/mysqladmin -u root -p extended-status
- MySQL의 환경변수를 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p variables
# /usr/local/mysql/bin/mysqladmin -u root -p variables
- 현재 MySQL의 정확한 버전과 여러 가지 실행정보 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p version
# /usr/local/mysql/bin/mysqladmin -u root -p version
- MySQL이 죽었는지 살았는지 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p ping
# /usr/local/mysql/bin/mysqladmin -u root -p ping

* MySQL 로그
- 쿼리로그 옵션 형식 : --log=쿼리로그파일명
                      이 형식을 사용하면 MySQL 데이터 디렉토리에 "쿼리로그파일명"으로 지정된 로그파일이 생성되며 SQL 쿼리로그를 기록한다.
- 바이너리로그 옵션 형식 : --log-bin=바이너리로그파일명
                          바이너리로그를 보기위해서는 /usr/local/mysql/bin/mysqlbinlog 명령어를 사용해야 한다.
      이 형식을 사용하면 MySQL 데이터디렉토리에 "바이너리로그파일명"으로 지정된 바이너리로그파일이 생성되면 MySQL데이터의 변경내역을 기록한다.
- SLOW쿼리 옵션 형식 : --log-slow-queries=SLOW쿼리파일명
                      이 형식을 사용하면 MySQL 환경변수 "long_query_time"에 초단위로 지정된 시간보다 초과하는 쿼리문만을 기록한다.

* 텍스트파일의 데이터를 MySQL의 특정 데이터베이스로 입력하기
사용형식 : /usr/local/mysql/bin/mysqlimport -u MySQL사용자 -p 데이터베이스명 텍스트파일명
          이 형식으로 실행하면 "텍스트파일명"에 저장되어 있는 데이터가 "데이터베이스명"의 특정 "테이블"의 데이터로 입력된다.
    위의 형식에서 데이터가 저장될 테이블이름은 "텍스트파일명"과 동일한 테이블이 된다.
    위의 형식에서 "텍스트파일명"은 "테이블명"과 동일한 이름이어야 한다.
    또한 저장될 테이블은 이미 생성되어 있어야 한다.
# cat addressbook
PARKSUNGSOO 011-111-2222 SEOUL A+
JUNGWOOYOUNG 011-222-3333 SEOUL B+
LEEJAESUK 016-222-1111 BUSAN C+
CHOYUEJIN 019-333-4444 BUSAN D+
# /usr/local/mysql/bin/mysqlimport -u root -p user_db2 addressbook
Enter password: ********
user_db2.addressbook: Records: 4 Deleted: 0 Skipped: 0 Warning: 0

* MySQL 데이터베이스 스키마 확인
사용형식 : /usr/local/mysql/bin/mysqlshow [옵션] [데이터베이스 [테이블 [컬럼]]]
          1. 위의 형식에서 특정 데이터베이스명이 주어지지 않는다면 MySQL내에 존재하는 모든 데이터베이스들을 나열한다.
    2. 위의 형식에서 특정 테이블명이 주어지지 않는다면 지정된 데이터베이스내의 모든 테이블들을 나열한다.
    3. 위의 형식에서 특정 컬럼이 주어지지 않는다면 지정된 테이블내에 존재하는 모든 컬럼들과 컬럼타입들을 나열한다.
- MySQL에 존재하는 모든 데이터베이스들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p
mysql> show databases;
- 특정 데이터베이스의 테이블들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db
mysql> use user_db;
mysql> show tables;
- 특정 테이블의 컬럼정보들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db addressbook
mysql> use user_db;
mysql> show columns from addressbook;
mysql> desc addressbook;
- 특정 테이블의 하나의 컬럼만 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db addressbook name

* MySQL 데이터베이스 데이터 백업과 복구
- /usr/local/mysql 디렉토리 전체를 압축백업하기
# cd /usr/local
# tar cvfpz /backup/mysql.tar.gz mysql
- MySQL 데이터 백업하기
사용형식1 : /usr/local/mysql/bin/mysqldump [옵션] DB [TABLES ..] > 파일명
            DB는 백업대상이 되는 데이터베이스명이고 TABLES는 지정한 백업대상 데이터베이스내에 존재하는 테이블명이다.
    이 백업의 의미는 DB의 데이터베이스내에 존재하는 테이블의 내용을 백업해서 "파일명"에 저장하라는 의미이다.
사용형식2 : /usr/local/mysql/bin/mysqldump [옵션] --databases [옵션] DB1 [DB2 ..] > 파일명
            --databases라는 옵션에 의해 DB1 DB2 의 데이터베이스들을 백업하여 "파일명"에 저장한다.
    즉 백업대상이 되는 데이터베이스가 2개 이상이 될 때에는 --databases 옵션을 사용하고 그 뒤에 백업할 데이터베이스를 지정한다.
사용형식2 : /usr/local/mysql/bin/mysqldump [옵션] --all-databases [옵션] > 파일명
            --all-databases라는 옵션은 MySQL내에 존재하는 모든 데이터베이스를 백어밷상으로 한다는 의미이다.
- 특정 데이터베이스 데이터 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p 백업대상_데이터베이스명 > 저장할_파일명
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p 복구할_데이터베이스명 < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u root -p mysql > mysql.sql
# /usr/local/mysql/bin/mysql -u root -p mysql < mysql.sql
# /usr/local/mysql/bin/mysqldump -u user -p user_db > user_db.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < user_db.sql
- 특정 데이터베이스의 특정 테이블의 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p 데이터베이스명 테이블명 > 저장할_파일명
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p 데이터베이스명 < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u user -p user_db addressbook > addressbook.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < addressbook.sql
- 여러 개의 데이터베이스 한번에 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p --databases [옵션] DB1 [DB2 ..] > 저장할_파일명
          CREATE DATABASE문과 USE문이 추가되어 있다.
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u user -p --databases user_db user_db2 > user_dbs.sql
# /usr/local/mysql/bin/mysql -u user -p < user_dbs.sql
-- MySQL 전체 데이터베이스 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p --all-databases > 저장할_파일명
# /usr/local/mysql/bin/mysqldump -u root -p --all-databases > all_dbs.sql
- 기존 테이블을 삭제후 백업된 파일로 복구하기 위한 백업방법
  mysqldump문으로 데이터베이스 백업시에 각각의  CRETE TABLE문 앞에 DROP TABLE문 삽입하기
# /usr/local/mysql/bin/mysqldump -u user -p --add-drop-table user_db > user_db.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < user_db.sql
- 데이터베이스 백업시 에러발생율 무시하고 계속 진행하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -f DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -f user_db > user_db.sql
- 원격서버의 MySQL 데이터베이스 백업하기 #1(기본포트 사용)
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -h 호스트명(IP주소) DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -h 192.168.0.111 user_db > user_db.sql
- 원격서버의 MySQL 데이터베이스 백업하기 #2(특정 포트번호 지정)
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -h 호스트명(IP주소) -P 포트번호 DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -h 192.168.0.111 -P 22222 user_db > user_db.sql
- 데이터 백업시 CREATE DATABASE 문을 생략하여 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -n [옵션] DB명 > 파일명
          /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-create-db [옵션] DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -n --databases user_db user_db2 > user_dbs.sql
# /usr/local/mysql/bin/mysqldump -u root -p -n --all-databases > all_dbs.sql
-- 데이터 백업시에 CREATE TABLE문을 생략하여 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -t DB명 > 파일명
          /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-crate-info DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -t user_db > user_db.sql
- 데이터는 백업하지않고 테이블 스키마만 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -d DB명 > 파일명
          /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-data DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -d user_db > user_db.sql
-- 특정 데이터베이스의 조건에 맞는 데이터만 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -w="WHERE 조건문" DB명 테이블명 > 파일명
          /usr/local/mysql/bin/mysqldump -u 사용자명 -p --where="WHERE 조건문" DB명 테이블명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -w="admin_id = 'admin'" user_db addressbook > admin_id.sql
- select문을 이용한 데이터 백업 및 복구
mysql> select * into outfile './backup.sql' from addressbook;
mysql> load data infile './backup.sql' into table addressbook;

* 데이터베이스의 깨진 테이블파일 복구
- 데이터파일 구성
테이블 하나에 아래의 파일형식을 가진 파일이 3개씩 생성되어 그 테이블의 데이터를 실제로 저장하는 용도로 사용된다.
*.MYD: 해당 테이블의 데이터가 저장되는 테이블 데이터파일이다.
*.MYI: 해당 테이블의 인덱스정보가 저장되는 테이블 인덱스파일이다.
*.frm: 해당 테이블의 테이블구조가 저장되는 테이블 스키마파일이다.
- myisamchk
사용형식 : myisamchk [옵션] 점검복구새상테이블인덱스파일(*.MYI)
          주의할 것은 myisamchk의 복구 대상파일은 반드시 MySQL의 인덱스파일이라는 것이다.
          또한 반드시 MySQL을 종료한 후에 사용하라.
- MySQL 테이블파일의 이상유무 점검
# /usr/local/mysql/bin/myisamchk /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk -c /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --check /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL 테이블 점검시 이상발견시만 알려주기
# /usr/local/mysql/bin/myisamchk -s /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --silent /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL의 테이블 점검(복구)시 가능한 상세하게 메시지 출력하기
# /usr/local/mysql/bin/myisamchk -v /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --verbose /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL의 테이블 이상유무 점검시 결과를 상세히 종합하여 보여주기
# /usr/local/mysql/bin/myisamchk -i /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --information /usr/local/mysql/var/user_db/addressbook.MYI
-- MySQL의 특정테이블 이상유무를 가장 정밀하게 점검하기
# /usr/local/mysql/bin/myisamchk -ev /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --extend-check --verbose /usr/local/mysql/var/user_db/addressbook.MYI
- 정형적인 방법으로 MySQL의 깨진 테이블파일 복구하기
# /usr/local/mysql/bin/myisamchk -rv /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --recover --verbose /usr/local/mysql/var/user_db/addressbook.MYI
-- MySQL의 깨진 테이블파일 안전모드로 복구하기
# /usr/local/mysql/bin/myisamchk -o /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --safe-recover /usr/local/mysql/var/user_db/addressbook.MYI
  -r옵션을 사용하여 테이블파일을 복구하는 것은 MySQL의 테이블 복구 방법 가운데 가장 정형적인 방법이다.
  하지만 데이터의 안전성을 고려한다면 -o옵션을 사용하라.
  깨진 테이블파일의 오류를 복구할 때에 시간이 좀 더 소요되더라도 데이터의 안전성이 걱정이 된다면 -o옵션을 사용하라.
  -o옵션을 사용하면 전통적인 방법으로 복구를 하며 -r옵션을 사용하는 것보다 속도는 좀 떨어지지만 -r옵션으로 복구하지 못하는 데이터파일을 복구할 수 있다.
- MySQL 테이블이 완전히 깨졌을 때의 최후의 복구방법
# /usr/local/mysql/bin/myisamchk -re /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk -oe /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL 내부명령어 사용
사용형식 : repair table 테이블명;
mysql> repair table addressbook;

댓글목록

등록된 댓글이 없습니다.

게시물 검색
전체 23건 1 페이지
  • mongodb 사용하기 조회, 추가, 삭제
    명령 프롬프트 상에서 mongo라고 입력해주면 mongo 셸로 접속됨 여기서 use 명령어로 데이터베이스를 선택해줘야함  insert() : 데이터 추가  find()  : 자료 조회 자료조회할때 pretty() 메소드 사용하면 조금더 예쁘게 출력됨 find()만 사용했을때  find().pretty() 사용했을때  remove() : 데이터 삭제 정규표현식 방법으로 소녀라는 단어를 포함한 모든자료를 삭제하기db.users.remove({name:/소녀/}) …
    작성자최고관리자 시간 07-06 조회 3236
  • MySQL 현재 접속자 보기 및 MYSQL 모니터링 방법
    출처 : http://www.albumbang.com/board/board_view.jsp?board_name=free&no=139가. 모니터링 및 초기화 명령어show status - MySQL 데이타베이스의 현재 상황show Processlist - MySQL 프로세스 목록show variables - 설정 가능한 모든 변수 목록flush logs - MySQL의 로그파일 초기화flush status - MySQL 상태정보 초기화flush thread - 쓰레드 캐시에 저장된 쓰레드 초기화flush tables - MySQL에 캐싱된 테이블 초기화flush privileges - 권한정보 재 설정나. Connection 튜닝1. status Aborted_clients - 클라이언트 프로그램이 비 정상적으로 종료된 수Aborted_connects - MySQL 서버에 접속이 실패된 수Max_used_connections - 최대로 동시에 접속한 수Threads_cached - Thread Cache의 Thread 수Threads_connected - 현재 연결된 Thread 수Threads_created - 접속을 위해 생성된 Thread 수Threads_running - Sleeping 되어 있지 않은 Thread 수2. system variableswait_timeout - 종료전까지 요청이 없이 기다리는 시간 ( TCP/IP 연결, Shell 상의 접속이 아닌 경우 )thread_cache_size - thread 재 사용을 위한 Thread Cache 수로써, Cache 에 있는 Thread 수보다 접속이 많으면 새롭게 Thread를 생성한다.max_connections - 최대 동시 접속 가능 수그외에 status 또는 system variables 값은 참고의 Mysql 메뉴얼을 참조해 주십시요.…
    작성자최고관리자 시간 06-29 조회 5007
  • MongoDB 튜토리얼
    MongoDB는 오픈 소스 문서 데이터베이스이자 NoSQL 데이터베이스를 이끌고 있습니다. MongoDB는 C ++로 작성되었습니다. 이 튜토리얼은 고도로 확장 가능하고 성능 지향적 인 데이터베이스를 생성하고 배치하는 데 필요한 MongoDB 개념에 대한 훌륭한 이해를 제공합니다. …
    작성자최고관리자 시간 06-19 조회 2684
  • table 앞수(전 행) 뒷수(후 행) 값 가져오기
    SELECT LAG(RN) OVER (ORDER BY RN)앞수,   RN 해당수,   LEAD(RN) OVER (ORDER BY RN)뒷수 FROM TABLE…
    작성자최고관리자 시간 02-01 조회 3945
  • R로 크롤링하기 - 보배드림 예제
    크롤링은 기본적인 과정은 web의 html 파일을 가져온 후, 파싱(parsing)을 해서 원하는 데이터에 접근하게 됩니다. parsing 방법에는 html 태그 혹은 css나 id 를 통해 원하는 데이터에 접근하는 방식과 html의 트리 구조를 이용하여 접근하는 XML 방식이 있습니다. 본 포스팅에서는 태그와 css를 이용해 접근하는 방식을 사용해 보겠습니다.먼저, rvest 패키지를 설치합니다.install.packages('rvest')보배 드림 사이트 바로 긁어와 보기본 실습에서는 중고차 사이트인 보배드림을 예로 들겠습니다. 아래는 해당 사이트의 html 태그를 가져와서 parsing하는 작업입니다.#내가 수집하길 원하는 페이지 주소
    url <- "http://www.bobaedream.co.kr/cyber/CyberCar.php?gubun=K&page=1"
    usedCar <- read_html(url) #해당 url 페이지의 html tag를 가져와서 parsing함.
    usedCar## {xml_document}
    ## <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    ## [1] <head>\n <title>중고차, 중고자동차, 중고차매매 | 보배드림 국산차매장</title>\n <meta htt ...
    ## [2] <body>&#13;\n<!--wrap-->&#13;\n<div class="wrap">&#13;\n&#13;\n<link ...이제부터 사이트 구조를 잘 파악해야 하는데, 예를 들어 제가 관심있는 정보가 자동차 종(type), 변속기(transmission), 연료종류(fuel), 거리(distance) 라고 합시다. 이 정보는 모두 .carinfo 라는 class 안에 들어가 있는 걸 확인할 수 있습니다. 이건 어떻게 확인하냐구요? 그건 chrome 이나 explorer 에서 F12키를 누르면 아래와 같이 개발자 도구창이 뜹니다.  이를 통해, 현재 웹 페이지의 html을 볼 수 있는데요. 좌측 상단에 네모위에 화살표가 그려져 있는 아이콘이 있는데 그걸 클릭후 아래와 같이 웹 페이지에서 원하는 부분을 선택해보세요. 그럼 웹 페이지에 대응하는 html 태그를 개발자 모드 창에서 확인할 수 있습니다.위 그림과 같이 우리가 원하는 정보는 <td class = "carinfo"> ... </td> 안에 묶여 있는 걸 알 수 있습니다. 따라서 먼저 carinfo 안의 모든 정보를 가져와 보겠습니다. #parsing한 usedCar 에서 css가 'carinfo' 인 것을 찾아라.
    carInfos <- html_nodes(usedCar, css='.carinfo')
    head(carInfos)## {xml_nodeset (6)}
    ## [1] <td class="carinfo"><a href="/cyber/CyberCar_view.php?no=640718&amp; ...
    ## [2] <td class="carinfo"><a href="/cyber/CyberCar_view.php?no=641415&amp; ...
    ## [3] <td class="carinfo"><a href="/cyber/CyberCar_view.php?no=641410&amp; ...
    ## [4] <td class="carinfo"><a href="/cyber/CyberCar_view.php?no=641379&amp; ...
    ## [5] <td class="carinfo"><a href="/cyber/CyberCar_view.php?no=641386&amp; ...
    ## [6] <td class="carinfo"><a href="/cyber/CyberCar_view.php?no=641421&amp; ...따라서 50개의 ‘.carinfo’ tag가 있기 때문에, carInfos에는 50개의 값이 벡터 형태로 담깁니다. 먼저 첫번째 경우만 예를 들어볼게요.#가장 첫번째 cafInfos로부터 정보 추출해보면,
    carInfos[1] %>% html_nodes('.title') %>% html_text()## [1] "쌍용 티볼리 에어 1.6 디젤 IX"이처럼 제목이 잘 출력된 것을 알 수 있습니다. 그런데 50개 모든 제목을 추출하고 싶으면 carInfos[1] 에서 index만([1]) 제거해 주면 됩니다. 자동으로 50개의 원소에 함수를 적용해 주는 것이죠(마치 apply 처럼)titles <- carInfos %>% html_nodes('.title') %>% html_text()
    head(titles)## [1] "쌍용 티볼리 에어 1.6 디젤 IX"
    ## [2] "현대 YF쏘나타 Y20 프리미어 최고급형"
    ## [3] "르노삼성 QM3 RE"
    ## [4] "현대 그랜져TG 아제라"
    ## [5] "기아 포르테 쿱 2.0 CVVT 프레스티지"
    ## [6] "기아 K7 VG270 럭셔리 프리미엄"변속기, 연료 정보 등은 sub_01이라는 class 안에 있군요. 따라서carDetainInfo <- carInfos %>% html_nodes('.sub_01') %>% html_text()
    head(carDetainInfo)## [1] "자동ㅣ디젤ㅣ3,700 km" "자동ㅣ가솔린ㅣ104,000 km"
    ## [3] "자동ㅣ디젤ㅣ32,000 km" "자동ㅣ가솔린ㅣ54,440 mi"
    ## [5] "수동ㅣ가솔린ㅣ32,000 km" "자동ㅣ가솔린ㅣ120,000 km"흠… 그런데! “자동ㅣ가솔린ㅣ41,000 km” 과 같이 하나의 문자에 정보가 묶여 있네요. 이를 특정 기호를 기준으로 분리해야 우리가 최종적으로 원하는 결과를 얻을 수 있을 것 같습니다.stringr이때, 사용하는게 Hadley아저씨("http://hadley.nz/")가 만든 string다루는 library, stringr 입니다.stringr을 사용하면 문자열을 특정 기호를 기준으로 분할 하거나, 특정 패턴(정규표현식)의 문자를 다른 문자로 바꿔주는 등 string을 다양하게 다룰 수 있습니다.install.packages('stringr')library(stringr)
    carInfos[1] %>% html_nodes('.sub_01') %>% html_text()## [1] "자동ㅣ디젤ㅣ3,700 km"1) ‘ㅣ’ 이라는 문자를 기준으로 나누고 싶을때는? : str_split(문자, ‘분리하고 싶은 문자’)(주의할 것은 키보드에 있는 | 표시와는 다른 문자에요! 복붙 해주세요.)str_split(carInfos[1] %>% html_nodes('.sub_01') %>% html_text(), 'ㅣ')## [[1]]
    ## [1] "자동" "디젤" "3,700 km"2) 쉼표, 문자를 제거하고 싶다면? : str_replace(문자, ‘제거하고 싶은 패턴’,‘대체하고 싶은 패턴’)아래 예제를 몇 개 볼게요.str_replace('20,000km', '0', '')## [1] "2,000km"str_replace_all('20,000km', '0', '')## [1] "2,km"str_replace_all('20,000Km', '[a-zA-Z]', '') #영어 소문자, 대문자 모두## [1] "20,000"str_replace_all('100,운용리스','[,가-하]','') #한글도 마찬가지로 가~하까지 모두## [1] "100"str_replace_all('20,000Km', '[,Km]', '')## [1] "20000"자 이제, 다시 정리해 볼게요.#먼저 첫페이지의 모든 제목 정보를 가져오는 명령어는
    titles <- carInfos %>% html_nodes('.title') %>% html_text()변속기, 연료, 거리는 “자동ㅣ가솔린ㅣ41,000 km”과 같이 특정 문자로 분할하기 위해 lapply를 적용합니다.splitFunction <- function(row){
    return(str_split(row, 'ㅣ')[[1]])
    }
    carDetailInfo <- lapply(carInfos %>% html_nodes('.sub_01') %>% html_text(), splitFunction)
    head(carDetailInfo)## [[1]]
    ## [1] "자동" "디젤" "3,700 km"
    ##
    ## [[2]]
    ## [1] "자동" "가솔린" "104,000 km"
    ##
    ## [[3]]
    ## [1] "자동" "디젤" "32,000 km"
    ##
    ## [[4]]
    ## [1] "자동" "가솔린" "54,440 mi"
    ##
    ## [[5]]
    ## [1] "수동" "가솔린" "32,000 km"
    ##
    ## [[6]]
    ## [1] "자동" "가솔린" "120,000 km"여기에 마무리 작업으로 뭘 하면 될까요? 각각의 데이터를 하나의 자료구조 즉, data.frame 형태로 바꿔야 겠죠. 먼저, 가져온 carDetailInfo는 list이기 때문에 이를 matrix로 바꾸면carDetailInfo <- matrix(unlist(carDetailInfo), ncol=3, byrow=T)
    head(carDetailInfo)## [,1] [,2] [,3]
    ## [1,] "자동" "디젤" "3,700 km"
    ## [2,] "자동" "가솔린" "104,000 km"
    ## [3,] "자동" "디젤" "32,000 km"
    ## [4,] "자동" "가솔린" "54,440 mi"
    ## [5,] "수동" "가솔린" "32,000 km"
    ## [6,] "자동" "가솔린" "120,000 km"#그리고 carDetailInfo 로부터 각각의 정보를 가져오자
    transmission <- carDetailInfo[,1]
    fuel <- carDetailInfo[,2]
    distance <- as.numeric(str_replace_all(carDetailInfo[,3], '[,a-z]','')) #숫자 형태로 바꿔주기 위해따라서 최종적으로 첫페이지에서 수집한 정보는 아래와 같이 data.frame으로 담을 수 있겠죠.data <- data.frame(titles, transmission, fuel, distance)
    head(data)## titles transmission fuel distance
    ## 1 쌍용 티볼리 에어 1.6 디젤 IX 자동 디젤 3700
    ## 2 현대 YF쏘나타 Y20 프리미어 최고급형 자동 가솔린 104000
    ## 3 르노삼성 QM3 RE 자동 디젤 32000
    ## 4 현대 그랜져TG 아제라 자동 가솔린 54440
    ## 5 기아 포르테 쿱 2.0 CVVT 프레스티지 수동 가솔린 32000
    ## 6 기아 K7 VG270 럭셔리 프리미엄 자동 가솔린 120000Quiz위와 비슷하게 가격, 조회수 등도 가져와 보세요for 문을 활용하여 10 page 까지 수집해 보세요.#hint:
    #아래 paste0 함수를 사용하여 뒤에 숫자만 바꿔주면서 수집하면 됩니다.
    url <- paste0("http://www.bobaedream.co.kr/cyber/CyberCar.php?gubun=K&page=",i) 출처: http://insightteller.tistory.com/entry/R로-크롤링하기-보배드림-예제 [Be a Insight teller] …
    작성자최고관리자 시간 07-05 조회 5772
  • rvest : R로 손쉽게 웹 스크래핑하기
    rvest: easy web scraping with RNovember 24, 2014 in Packagesrvest is new package that makes it easy to scrape (or harvest) data from html web pages, inspired by libraries like beautiful soup. It is designed to work with magrittr so that you can express complex operations as elegant pipelines composed of simple, easily understood pieces. Install it with:install.packages("rvest")rvest in actionTo see rvest in action, imagine we’d like to scrape some information about The Lego Movie from IMDB. We start by downloading and parsing the file with html():library(rvest)
    lego_movie <- html("http://www.imdb.com/title/tt1490017/")To extract the rating, we start with selectorgadget to figure out which css selector matches the data we want: strong span. (If you haven’t heard of selectorgadget, make sure to read vignette("selectorgadget") – it’s the easiest way to determine which selector extracts the data that you’re interested in.) We use html_node() to find the first node that matches that selector, extract its contents with html_text(), and convert it to numeric with as.numeric():lego_movie %>%
    html_node("strong span") %>%
    html_text() %>%
    as.numeric()
    #> [1] 7.9We use a similar process to extract the cast, using html_nodes() to find all nodes that match the selector:lego_movie %>%
    html_nodes("#titleCast .itemprop span") %>%
    html_text()
    #> [1] "Will Arnett" "Elizabeth Banks" "Craig Berry"
    #> [4] "Alison Brie" "David Burrows" "Anthony Daniels"
    #> [7] "Charlie Day" "Amanda Farinos" "Keith Ferguson"
    #> [10] "Will Ferrell" "Will Forte" "Dave Franco"
    #> [13] "Morgan Freeman" "Todd Hansen" "Jonah Hill"The titles and authors of recent message board postings are stored in a the third table on the page. We can use html_node() and [[ to find it, then coerce it to a data frame with html_table():lego_movie %>%
    html_nodes("table") %>%
    .[[3]] %>%
    html_table()
    #> X 1 NA
    #> 1 this movie is very very deep and philosophical mrdoctor524
    #> 2 This got an 8.0 and Wizard of Oz got an 8.1... marr-justinm
    #> 3 Discouraging Building? Laestig
    #> 4 LEGO - the plural neil-476
    #> 5 Academy Awards browncoatjw
    #> 6 what was the funniest part? actionjacksinOther important functionsIf you prefer, you can use xpath selectors instead of css: html_nodes(doc, xpath = "//table//td")). Extract the tag names with html_tag(), text with html_text(), a single attribute with html_attr() or all attributes with html_attrs().Detect and repair text encoding problems with guess_encoding() and repair_encoding().Navigate around a website as if you’re in a browser with html_session(), jump_to(), follow_link(), back(), and forward(). Extract, modify and submit forms with html_form(), set_values() and submit_form(). (This is still a work in progress, so I’d love your feedback.)To see these functions in action, check out package demos with demo(package = "rvest").…
    작성자최고관리자 시간 07-05 조회 2294
  • R과 MySQL 데이터베이스 연결 방법
    데이터베이스에 연결된 R 환경은 데이터베이스의 저장 용량과 R의 계산능력 사용할 수 있습니다. 이번 포스팅에서는 MySQL과 R을 서로 연결하는 방법을 정리해 보겠습니다.MySQL과 R을 연결하기 위해서는 RMySQL 패키지를 이용합니다. 이 패키지는 R 환경을 위한 데이터베이스 인터페이스와 MySQL 드라이버를 포함한 패키지로 주로 다음과 같은 상황에서 사용할 수 있습니다.데이터가 MySQL 데이터베이스에 저장되어 있고 R 환경에서 이 데이터를 추출해 분석하고 싶을 때R에서 작성한 데이터를 MySQL의 데이터베이스에 저장하고 싶을 때MySQL에 ODBC드라이버를 인스톨하면 RODBC을 이용해도 같은 기능을 실현할 수 있습니다. 최근 버전의 RMySQL는 DBI 패키지에 구현된 데이터베이스 인터페이스 정의를 따르고 있습니다. MS WindowsR 2.12 이후로는 RMySQL의 바이너리 파일이 배포되지 않기 때문에 사용자가 컴파일해서 설치해야 합니다.필수 소프트웨어Rtools (R의 버전에 대응하는 것)MySQL Client C API library (MySQL Community Server 에도 포함되어있음)MySQL Community Server를 PC에 디폴트로 설치한 경우에는 MySQL Client C API library가 이미 들어가 있기 때문에 별도로 설치할 필요는 없습니다. 단, 별도의 호스트에 설치된 MySQL Server를 이용하는 경우에는 MySQL Client C API library를 별도로 설치해야 합니다.RMySQL 컴파일 순서R의 환경변수 MYSQL_HOME에 MySQL 설치 디렉터리를 8.3형식으로 지정합니다.MySQL Community Server 5.6의 MSI Installer판을 디폴트로 설치한 경우C:\Program Files\R\설치한 R 버전\etc 디렉터리에 Renviron.site라는 이름으로 텍스트 파일을 작성하여 이하의 내용을 입력합니다.MYSQL_HOME=C:/PROGRA~1/MySQL/MYSQLS~1.6MySQL이 설치된 디렉터리에 있는 lib\libmysql.lib을 lib\opt\libmysql.lib로 복사합니다.R에서 다음 명령을 실행합니다. 이때 R 콘솔에서 \Rtools\bin, \Rtools\gcc-4.6.3\bin 이하의 실행 파일들을 사용하게 되므로 두 디렉터리의 Path가 지정되어 있어야 합니다(윈도즈에서 Path를 추가하는 방법은 이곳을 참조하세요). 만약 RStudio에서 컴파일을 한다면 Path 지정 필요 없이 그냥 알아서 해 줍니다.> install.packages("DBI")
    > install.packages("RMySQL", type = "source")
    리눅스 (Ubuntu)다음 명령을 실행하여 R과 MySQL을 설치합니다.sudo apt-get update
    sudo apt-get install r-base
    sudo apt-get install r-dev
    sudo apt-get install r-cran-rmysql
    sudo apt-get install r-cran-dbi
    sudo apt-get install mysql-server my-client
    sudo apt-get install libmysqlclient-dev
    윈도즈의 삽질에 비하면 정말 간단하죠? R의 태생이 그런지라 불편 없이 R을 사용하고자 한다면 리눅스 환경을 강력 추천합니다.사용법R과 MySQL이 같은 호스트에서 실행되고 있고, test_db라는 데이터베이스에 test_user라는 사용자가 접근권한을 가지고 있다고 가정할 때, MySQL의 test_db 안의 test_table이라는 테이블의 내용을 쿼리를 이용하여 R의 데이터프레임 test.table로 저장하기 위해서는> library(RMySQL)
    > con <- dbConnect(m, dbname = "test_db", user = "test_user")
    > query.result <- dbSendQuery(con, "SELECT * FROM test_table")
    > test.table <- fetch(query.result)
    > dbDisconnect(con)
    여기서 dbConnect()는 데이터베이스와 접속을 개시하는 함수, dbDisconnect()는 접속을 종료하는 함수입니다. dbSendQuery()은 SQL문을 MySQL서버에 보내는 함수이며 그 응답을 받아 R의 데이터프레임으로 저장해 주는 함수가 fetch()입니다.dbSendQuery()와 fetch()를 동시에 수행하는 dbGetQuery() 함수를 사용하여도 무방합니다.> library(RMySQL)
    > con <- dbConnect(dbDriver("MySQL"), dbname = "test_db", user = "test_user",
    + password = "password")
    > dbListTables(con) #DB abc에 있는 테이블목록 확인
    > test.table <- dbGetQuery(con, "SELECT * FROM test_table")
    > dbDisconnect(con)
    R에서 작성된 result라는 데이터프레임을 MySQL 데이터베이스에 test_table2라는 테이블로 저장하기 위해서는 dbWriteTable() 함수를 이용합니다.> dbWriteTable(con, "test_table2", result, overwrite = TRUE)
    만약, MySQL 서버가 R과 같은 호스트에 있지 않고 dbserver.domain라는 호스트에서 운영되고 있다면、> library(RMySQL)
    > con <- dbConnect(dbDriver("MySQL"), host = "dbserver.domain", dbname = "test_db",
    + user = "test_user", password = "password")
    >
    R 언어에서 명시적으로 데이터베이스 사용자 및 암호를 표시할 때 보안상의 문제점을 일으킬 수 있으므로 로컬 디렉터리 구성 파일 (~/.my/cnf)에서 MySQL을 사용하는 사용자 그룹을 정의 할 수 있습니다.[local]
    user = root
    password = ultra_secret
    host = localhost

    [nerds]
    user = supernerd
    password = galaxy
    host = dbserver.domain
    그런 다음 R 사용자 그룹을 사용하여> library(RMySQL)
    > con <- dbConnect(MySQL(), group = "nerds", dbname = "test_db")
    > test.table <- dbGetQuery(con, "SELECT * FROM test_table")
    > dbDisconnect(con)
    지금까지 R과 MySQL을 연결하는 방법을 방법에 대해 정리해 보았습니다. 적절한 SQL 쿼리를 이용해 필요한 데이터를 만들 수 있다면 데이터 전체를 R로 불러와 데이터 조작을 하는 것보다 메모리의 효율적인 사용에 매우 큰 도움이 될 수 있습니다. …
    작성자최고관리자 시간 07-05 조회 1812
  • mysql master slave 동기화
     서론응용 프로그램 혹은 웹 페이지의 작은 기능 단위 연동을 위해서는, rsync로 db 파일을 동기화하는 경우가 있었다.하지만 rsync 서비스도 정상인지 봐야 하고 스케줄링(crontab) 주기도 설정해야 하고 간혹 문제가 생기기도 하고 테이블 index가 꼬이거나 파일이 깨지는 등 번거로운 방법이다. 그래서 향후에는 작은 부분이더라도 Replication을 하기로 했다.특정 DB 혹은 특정 Table만 동기화 설정이 가능하기 때문이다. 선행 작업Master에서 Slave로 동기화하기를 원하는 DB(및 Table)은 미리 Dump를 떠서 최초 1번은 Slave에 생성해 놓아야 한다.  Master 서버 설정우선 server-id가 1로 설정되어 있는지 확인한다.Master는 보통 1로 설정한다. 그래야 Slave에서 부가적인 설정을 할 필요가 없다. # cat /etc/my.cnf -n | grep server-id67 server-id          = 1  이번엔 mysql에 접속해서 상태를 확인한다.  mysql> show master status;+---------------+----------+--------------+------------------+| File          | Position | Binlog_do_db | Binlog_ignore_db |+---------------+----------+--------------+------------------+| mysql-bin.189 | 91120973 |              |                  |+---------------+----------+--------------+------------------+ File, Position 값을 각각 메모해 둔다(mysql-bin.189, 91120973). 마지막으로 본 서버에 접속해서 동기화 받아갈 Slave 서버들에 권한을 주자.  mysql> GRANT REPLICATION SLAVE ON *.* TO 유저@'%' IDENTIFIED BY '패스워드';mysql> FLUSH PRIVILEGES; *.*은 DB.Table 이고 %는 ip 모두 허용... 인데 GRANT는 익숙한 구문이므로 자세한 설명은 생략한다.  Slave 서버 설정Master와 같이 server-id 값을 확인한다.는 Master와 다른 값을 가져야 하므로 2로 수정하는게 좋겠다. # cat /etc/my.cnf -n | grep server-id67 server-id          = 2  Slave의 mysql에 접속해서 동기화 받을 DB가 존재하는 Master 서버의 정보를 입력할 차례다. mysql> STOP SLAVE;mysql> CHANGE MASTER TO MASTER_HOST='192.168.xxx.xxx', MASTER_USER='유저',MASTER_PASSWORD='패스워드', MASTER_LOG_FILE='mysql-bin.189', MASTER_LOG_POS=91120973;mysql> START SLAVE; Master에서 메모한 2개의 값을 MASTER_LOG_FILE 부분과 MASTER_LOG_POS 부분에 대입한다. Slave가 Master에게서 제대로 동기화 받아오는지 확인해 보자. mysql> SHOW SLAVE STATUS \G;*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.xxx.xxx                                     ...(생략)... Waiting for master to send event 문구가 표시되면 정상이다.  여기서 일단 끝인데... 조금 더 세부적으로...모든 DB를 동기화하는 것이 아니라, 특정 DB 특정 Table만 동기화 하고 싶다면 아래와 같이 my.cnf 파일에 설정한다.  # vi /etc/my.cnf[mysqld]...(생략)...replicate-do-table = DB.Table1replicate-do-table = DB.Table2replicate-do-db = DB1replicate-do-db = DB2  Slave에 설정할 수도 있고 Master에 설정할 수도 있다.한 라인에 여러 값을 기입할 수는 없었다. 여러 라인에 각각 지정해야 한다.replication-ignore-table은 동기화 받지 않을 테이블만 기록하는 설정이다.이 외에도 여러 설정이 존재한다(더 자세한건 구글링을).참고 사항1. 기본적인 것이지만 iptables 등의 방화벽 설정에서 서버 ip, port를 open해야 한다.2. 역시 기본적인 것이지만 my.cnf 파일을 수정했다면 mysqld service를 재시작해야 한다.   출처: http://whiterussian.tistory.com/44 [화이트 러시안] …
    작성자최고관리자 시간 03-22 조회 1652
  • CodeIgniter/ActiveRecord setup to use master + slave db 복제
    CODEIGNITER/ACTIVERECORD SETUP TO USE MASTER + SLAVE DB REPLICATIONAUG26This is how you can set up CodeIgniter to direct mysql queries to different read/write hosts in your db replicated environment, using a db_slave for your SELECT’s, and a db_master for the INSERT/UPDATE/DELETE queries.File: application/config/database.phpSpecify the different database hosts in the database config file:< ?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    $active_group = "master";
    $active_record = TRUE;

    # db_master
    $db['master']['hostname'] = "host1";
    $db['master']['username'] = "username";
    $db['master']['password'] = "password";
    $db['master']['database'] = "exampledb";
    $db['master']['dbdriver'] = "mysql";
    $db['master']['dbprefix'] = "";
    $db['master']['pconnect'] = FALSE;
    $db['master']['db_debug'] = TRUE;
    $db['master']['cache_on'] = FALSE;
    $db['master']['cachedir'] = "";
    $db['master']['char_set'] = "utf8";
    $db['master']['dbcollat'] = "utf8_general_ci";

    #db_slave
    $db['slave']['hostname'] = "host2";
    $db['slave']['username'] = "username";
    $db['slave']['password'] = "password";
    $db['slave']['database'] = "exampledb";
    $db['slave']['dbdriver'] = "mysql";
    $db['slave']['dbprefix'] = "";
    $db['slave']['pconnect'] = FALSE;
    $db['slave']['db_debug'] = TRUE;
    $db['slave']['cache_on'] = FALSE;
    $db['slave']['cachedir'] = "";
    $db['slave']['char_set'] = "utf8";
    $db['slave']['dbcollat'] = "utf8_general_ci";
    ...File: application/core/My_Model.phpAdd this into My_Model:< ?php

    class MY_Model extends CI_Model {
    function __construct(){
    parent::__construct();
    $this->db_master = $this->load->database('default', TRUE);
    $this->db_slave = $this->load->database('default', TRUE);
    }


    }File: application/models/example_model.phpUse the read/write queries in your models like this:< ?php
    class example_model extends MY_Model {

    function example_model()
    {
    parent::MY_Model();
    }

    # read query
    function getSomething()
    {
    $query = $this->db_slave->get('mytable'); // db_slave
    return $query->result();
    }

    # write query
    function insertSomething()
    {
    $this->db_master->insert('mytable', $_POST); // db_master
    return $this->db_master->insert_id();
    }That´s it!…
    작성자최고관리자 시간 03-22 조회 2099
  • php 두개의 DB 불러오기

     //db1 연결 함수 선언
     function db1($database = "db1"){
         $host = "host";
         $user = "userid";
         $pass = "password";

         $connect = @mysql_connect($host, $user, $pass) or die("ERROR!");
         mysql_query(" SET NAMES 'utf8' ");
         return $connect;
     }

     //db2 연결 함수 선언
     function db2($database = "db2"){
         $host = "host";
         $user = "userid";
         $pass = "password";

         $connect = @mysql_connect($host, $user, $pass) or die("ERROR!");
         mysql_query(" SET NAMES 'utf8' ");
         return $connect;
     }

     //connection resource variable
     $db1 = db1();
     $db2 = db2();

     $sql = "select * form test_table where userid = '88240'";
     $query = mysql_query($sql, db1); //db1의 test_table을 실행하고 싶을때
     $query = mysql_query($sql, db2);  //db2의 test_table을 실행하고 싶을때

    작성자최고관리자 시간 09-12 조회 4196
  • 문자 order by 특정필드 특정 순서 정의
    select * from pet order by field(species, 'cat', 'dog', 'bird');

     


    +----------+--------+---------+------+------------+------------+
    | name | owner | species | sex | birth | death |
    +----------+--------+---------+------+------------+------------+
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    | Slim | Benny | snake | m | 1996-04-29 | NULL |
    | Claws | Gwen | cat | m | 1994-03-17 | NULL |
    | Fluffy | Harold | cat | f | 1993-02-04 | NULL |
    | Buffy | Harold | dog | f | 1989-05-13 | NULL |
    | Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
    | Fang | Benny | dog | m | 1990-08-27 | NULL |
    | Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
    | Whistler | Gwen | bird | N | 1997-12-09 | NULL |
    +----------+--------+---------+------+------------+------------+
    작성자최고관리자 시간 08-08 조회 2067
  • table 초기화
    truncate `tblName`;  truncate `tblName`;
    tblName 대신 table명을 실행하면 초기화된다. 초기화하기전엔 데이터의 중요성을 다시 한번 확인하기 바란다.…
    작성자최고관리자 시간 03-13 조회 1736
  • phpMyAdmin 업로드 파일 용량 늘리기
    phpmyadmin 에서는 업로드 용량에 제한이 되어 있다. 초기값은 2M 이다.

    이 값을 변경하기 위해서는 /etc/php5/apache2에 보면 php.ini 파일이 있을 것이다.

    거기서 upload_max_filesize = 2M 을 적당한 값으로 수정한다.



    phpmyadmin import 용량 늘리기(mysql 용량이 업로드제한 용량보다 클때)
    ->usr/local/php/lin/php.ini 파일을 열어 post_max_size=2M를 조정한다.



    phpmyadmin import시 시간초과 일때
    ->usr/local/php/lin/php.ini 파일을 열어 mysql.connect_timeout =60 시간을 수정한다.…
    작성자최고관리자 시간 09-11 조회 6578
  • mysql UTF8 설정
    우분투 경우

    터미널에서 ...
    cd /etc/mysql
    ls -l
    sudo gedit ./my.cnf

    1. my.cnf 파일에 아래 내용 추가
    [client]
    default-character-set=utf8

    [mysqld]
    character-set-client-handshake=FALSE
    init_connect="SET collation_connection = utf8_general_ci"
    init_connect="SET NAMES utf8"
    default-character-set=utf8
    character-set-server=utf8
    collation-server=utf8_general_ci

    [mysqldump]
    default-character-set=utf8

    [mysql]
    default-character-set=utf8

    저장

    2. mysql을 재시작.
    $sudo /etc/init.d/mysql restart

    3. 변경 여부 확인.
    $mysql -u id -p
    mysql> status…
    작성자최고관리자 시간 04-13 조회 1794
  • MERGE 형식의 테이블
    MERGE 형식의 테이블은 MRG_MyISAM 테이블이라고도 한다.
    모아 사용할 모든 테이블은 동일한 컬럼을 가지며 key 정보를 가지고 있는 필요한 몇 개의 MyISAM 테이블을 모아서 만든 테이블이 MERGE 테이블이며, MyISAM 테이블처럼 사용 할 수 있다.
    그러므로 오직 select, delete, update만 테이블 집합인 MERGE 테이블에서 수 행할 수 있다.
    MERGE 테이블을 drop하더라도 원래의 테이블의 데이터는 그대로 있고 오직 MERGE 테이블 데이터만 drop된다.
    또한 DELETE FROM merge_table처럼 where 조건 없이 실행하면 해당 테이블의 모든 데이터가 삭제된다.

    컬럼이 서로 다르게 압축되었거나, 아주 동일한 컬럼을 가지고 있지 않거나, key 순서가 테이블마다 다르게 가질 경우에도 테이블들을 merge할 수 없다. 그러나 myisampack로 압축된 테이블은 merge할 수 있다.

    MERGE 테이블을 만들면 테이블 정의 파일인 '.frm'과 테이블 목록 파일인 '.MRG'이 생기며, '.MRG' 파일에는 인덱스 파일 목록인 '.MYI'의 정보도 들어 있다. MERGE 테이블은 물론이고 MERGE 테이블에 모아 쓸 모든 테이블도 물론 같은 데이터베이스에 있어야 한다.

    MERGE 테이블의 장점:
    #&8226; 한 무리의 등록 테이블을 쉽게 관리한다.
    • 속도가 빠르다.
    • 효과적으로 탐색한다.
    • 효과적으로 수리한다.
    • 여러 파일을 하나의 파일처럼 순간적으로 매핑한다.
    • 큰 테이블을 join하기 보다 MERGE 테이블로 하면 빠르고 디스크 공간을 절약한다.
    • 운영체제상의 파일 크기 한계까지 사용할 수 있다.
    • 하나의 테이블에 MERGE로 alias/synonym을 여러 개 붙일 수 있다.

    MERGE 테이블의 단점:
    • 동일한 MyISAM 테이블에만 사용된다.
    • REPLACE 문을 사용할 수 없다.
    • MERGE 테이블은 file descriptor를 더 많이 사용한다. 예를 들어, 10개의 테이블을 매
    핑하여 만든 MERGE 테이블을 10명이 사용한다면, 10*10+10라고 하는 file descriptor가
    요구되는데 이는 (10개의 데이터파일) + (10명의 사용자) + (10개의 공유 인덱스 파일)
    이 필요하기 때문이다.
    • key를 읽는 것이 느리다. 그 이유는 key를 읽을 때 MERGE storage engine은 모든 해
    당 테이블에 대해서 key를 읽겠다고 한 다음, 주어진 key에 어느 것이 가장 근접하게
    매치되는지 체크하기 때문이다.
    • MERGE 테이블에 매핑된 해당 테이블이 'open'되어 있을 경우에는 DROP TABLE, ALTER
    TABLE, where절 없는 DELETE FROM tbl_name, REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE
    TABLE, ANALYZE TABLE을 실행할 수 없다. MERGE 테이블이 원래의 테이블이 참조하고
    있는 중에 이러한 명령을 실행하면 예기치 못한 결과가 된다. 그러므로 이러한 문제를
    피하려면, FLUSH TABLES 명령을 실행하고 나서 하면 된다.

    MERGE 테이블을 만들 때 UNION(list-of-tables)를 사용하여 만들어야 하는데, MERGE 테이블 들어가는 UNION 문의 첫 번째 테이블과 마지막 테이블은 INSERT_METHOD를 지정할 수도 있다. INSERT_METHOD를 지정하지 않거나 NO를 지정하지 않으면, MERGE 테이블 에 INSERT 문을 실행하면 에러메시지를 받게된다.
    【예제】
    mysql> CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
    Query OK, 0 rows affected (0.03 sec)

    mysql> CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
    Query OK, 0 rows affected (0.01 sec)

    mysql> INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
    Query OK, 3 rows affected (0.02 sec)
    Records: 3 Duplicates: 0 Warnings: 0

    mysql> INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
    Query OK, 3 rows affected (0.01 sec)
    Records: 3 Duplicates: 0 Warnings: 0

    mysql> CREATE TABLE total (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20))
    -> TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
    Query OK, 0 rows affected (0.01 sec)

    mysql> SELECT * FROM total;
    +---+---------+
    | a | message |
    +---+---------+
    | 1 | Testing |
    | 2 | table |
    | 3 | t1 |
    | 1 | Testing |
    | 2 | table |
    | 3 | t2 |
    +---+---------+
    6 rows in set (0.00 sec)
    mysql>

    예제에서 컬럼 a는 PRIMARY KEY로 선언되었지만, UNIQUE하지 않은 것처럼 MERGE 테 이블은 MyISAM 테이블에서 데이터를 가져오기 때문에 UNIQUE를 강요할 수 없다.
    MERGE 테이블을 re-map하려면 다음과 같은 방법중의 하나를 사용한다.

    방법1) MERGE 테이블을 DROP하고 MERGE 테이블을 다시 만든다.
    방법2) ALTER TABLE tbl_name UNION(...)을 사용한다.
    방법3) '.MRG' 파일을 변경하고 MERGE 테이블에 대해 FLUSH TABLE을 실행한다.

    방법3의 쉘 프롬프트에서 '.MRG' 파일을 직접 다루는 방법은 다음 예와 같다.

    【예제】
    # cd /export/home/mysql/var/jijoeDB
    # rm total.MRG ☜ 고치기 위해서
    # vi total.MRG
    t1
    t2
    # chown mysql:mysql total.MRG
    # chmod 660 total.MRG
    # mysqladmin -p flush-tables

    mysql> SELECT * FROM total;
    +---+---------+
    | a | message |
    +---+---------+
    | 1 | Testing |
    | 2 | table |
    | 3 | t1 |
    | 1 | Testing |
    | 2 | table |
    | 3 | t2 |
    +---+---------+
    6 rows in set (0.00 sec)
    mysql>…
    작성자최고관리자 시간 02-01 조회 1899

회원로그인

Copyright © 2001-2016 ITNANUM. All Rights Reserved..