mysql 바이너리 파일로 DB 복구

리눅스/MySQL|2015. 1. 16. 11:04
반응형

DB작업전 반드시 data를 백업 후 작업을 진행하도록 합니다.

# cp -arp /usr/local/mysql/data /usr/local/mysql/data_bak_100406

 

mysql data 폴더를 보면

 

mysql-bin.000001

mysql-bin.000002

mysql-bin.000003

mysql-bin.000004, ...... 등의 파일이 있습니다.

 

mysql 을 설치하고 부터 실행하는 모든 명령어들(create, update, delete, alter 등) 이 기록에 남는데

- 웹사이트에서 게시글 등록 등의 작업도 로그에 남습니다. -

이러한 기록을 이용하여 현재까지의 DB를 만들 수가 있습니다.

물론 문제발생 시간을 확인하여 그 전 시간까지만 복구를 해야합니다.

 

1. mysql 바이너리 로그 파일 확보 

mkdir /usr/local/src/mysql_bin_repair

cp -arp /usr/local/mysql/data/mysql-bin.0* /usr/local/src/mysql_bin_repair

cd /usr/local/src/mysql_bin_repair

 

2. mysql 쿼리문 추출

이제 바이너리 로그파일을 mysql 에 입력 가능한 쿼리문으로 변경해야 합니다.

 

/usr/local/mysql/bin/mysqlbinlog -d sysdocu -s mysql-bin.000001 > mysql-bin.000001.sql

/usr/local/mysql/bin/mysqlbinlog -d sysdocu -s mysql-bin.000002 > mysql-bin.000002.sql

/usr/local/mysql/bin/mysqlbinlog -d sysdocu -s mysql-bin.000003 > mysql-bin.000003.sql

/usr/local/mysql/bin/mysqlbinlog -d sysdocu -s mysql-bin.000004 > mysql-bin.000004.sql

 

[옵션 설명]

-d DB명 : 바이너리 로그파일에서 해당 DB에 관한 쿼리만 추출합니다. 예) sysdocu 이라는 DB 복구

-s : 주석처리된 내용은 추출대상에서 제외합니다.

 

3. DB 삭제 및 복구

위와같이 문제발생 시간 전까지의 모든 바이너리 로그를 새로운 파일로 생성을 합니다.

생성된 *.sql 파일을 vi 로 열어보면 create database 에서부터 지금까지의 쿼리문이 기록이 되어있습니다. 

이제 이 쿼리문을 이용하여 DB를 복구할 수 있습니다.

 

mysql -p

Enter password: (mysql root 패스워드 입력)

기존에 복구하고자 하는 DB가 있을 경우 복구가 되지 않으니 해당 DB를 삭제합니다.

 

mysql> drop database sysdocu;

 

이제 아래와 같이 쿼리추출파일을 실행하여 data를 생성합니다.

 

mysql> . mysql-bin.000001.sql

mysql> . mysql-bin.000002.sql

mysql> . mysql-bin.000003.sql

mysql> . mysql-bin.000004.sql

 

복구가 완료되었습니다. select 명령어를 이용하여 해당 DB에 데이타가 정상 입력되었는지 확인해봅니다.

반응형

댓글()

테이블내 특정 문자 치환 방법 (SQL Injection 공격 복구)

리눅스/MySQL|2015. 1. 16. 11:04
반응형

mysql> update sysdocu set subject=REPLACE(subject,"<script language=javascript src="http://192.168.10.2/ajax.js></script>","");

 

sysdocu : 테이블명

subject : 필드명

첫번째 "" : 변경 대상 내용

두번째 "" : 대체할 내용


MSSQL 의 경우


UPDATE 테이블명 SET 컬럼=replace(cast(컬럼 as varchar(8000)),substring(cast(컬럼 as varchar(8000)),charIndex('</title>',컬럼),len(cast(컬럼 as varchar(8000)))),'') WHERE charIndex('</title>',컬럼) > 0


</title> 를 포함해서 뒤로 삭제

반응형

댓글()

예약어로 인해 복구가 되지 않을경우

리눅스/MySQL|2015. 1. 16. 11:03
반응형

group 이 MySQL에서 예약된 단어라서 그렇습니다.

예약어 들을 명명하여 사용하는것은 권장되지 않습니다.

다른이름으로 바꾸는것을 권해드리고요...

 

바꿀수 없다면 그레이브(`) 로 감싸서 하시면 되겟습니다.

 

`group` varchar(200) default Null,

 

 

[발췌] 지식인 | jpriest (http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10205&docId=71119254&qb=bXlzcWwgNSDsmIjslb3slrQg7JeQ65+s&enc=utf8&section=kin&rank=1&sort=0&spq=0&pid=f2X%2BXg331xossaFIdcRssv--122568&sid=S2u9bn20a0sAADbkLzY)

반응형

댓글()

[error] checking "LinuxThreads"... "Not found"

리눅스/MySQL|2015. 1. 16. 11:03
반응형

mysql 4.0.27 설치시 에러 발생

 

checking "LinuxThreads"... "Not found"
configure: error: This is a linux system and Linuxthreads was not
found. On linux Linuxthreads should be used.  Please install Linuxthreads
(or a new glibc) and try again.  See the Installation chapter in the

# echo '/* Linuxthreads */' >> /usr/include/pthread.h

[출처] http://onlybible.tistory.com/917


반응형

댓글()

my.cnf 설정파일

리눅스/MySQL|2015. 1. 16. 11:02
반응형

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

 

             my.cnf

 

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

-- 용도별 카피

 

my-small.cnf                    :            64M

my-medium.cnf                :            128-256M

my-large.cnf                    :            512M

my-huge.cnf                    :            1~2G

 

 

 

[mysqld]

 

             key_buffer         

 

                           - 인덱스를 위한 버퍼 공간                         

                           - 키버퍼의 크기는 공유된 쓰레드의 크기이며 중복된 키를 자주 사용할 경우 속도증진

                           - show status  Key_blocks_used 를 체크

                                        Key_blocks_used * 1024  2~3  ... (메모리충분할 경우)

                                        Key_blocks_used * 1024 (보통)                 

                                       

                                       ex) 아래와 같은 상태가 될때가 key_buffer 가 적당..

                                                     Key_reads / Key_read_request < 0.01

                                                     key_write / Key_write_requests = 1

 

 

             max_connections

 

                           - show status  max_used_connections 를 체크 (최대값보다 10% 크게 설정)

                          

             table_cache

 

                           - MySQL 서버가 한번에 열수 있는 테이블의 개수설정

                           - show status  Opened_tables 값이 클 경우 table_cache 를 늘림

                           - max_connections 값이 100 일 경우 100 * n (조인해서 열수 있는 최대테이블개수)

                                        ex) 테이블 20 , max_connections 100 이라면

                                                     table_cache = 512

 

 

             sort_buffer / record_buffer

 

                           - max_used_connections 의 값에 따라 증가

                           - 한번에 많은 쓰레드가 동시에 붙을 경우는 증가

                           - max_used_connections 가 높은 경우

                                        sort_buffer=6M

                                        record_buffer=2M

                                        (sort_buffer + record_buffer < 8M)

                           - 메모리가 4G 정도 된다면 sort_buffer 값을 32M 정도를 잡는 것이 좋다.

                           - order by , group by 절을 빠르게 하기 위해서 sort_buffer 값을 증가시킬수 있다.

                           - 많은 연속적인 테이블 스캔이 이루어진다면 record_buffer 값을 증가

 

            

             thread_cache / thread_concurrency

                          

                           - cpu 개수 * 2

            

 

 

             -- 퀴리캐시 설정 방법

            

             set-variable = query_cache_limit=1M

             set-variable = query_cache_size=2M

             set-variable = query_cache_type=1

            

             -> 쿼리캐시 사용 안할려면 query_cache_size  = 0  으로 설정.

             -> query_cache_type

                           1)          0           :            off 쿼리캐시 기능을 사용하지 않음

                           2)          1            :            on , SELECT SQL_NO_CACHE 를 제외하고 쿼리캐시사용

                           3)          2            :            DEMAND, SELECT SQL_CACHE 사용시만 쿼리캐시사용        

 

             -> 쿼리캐시 변수보기

                           show variables like 'query%';

 

                                        +-------------------+----------+

                                        | Variable_name     | Value    |

                                        +-------------------+----------+

                                        | query_cache_limit | 1048576  |

                                        | query_cache_size  | 33554432 |

                                        | query_cache_type  | ON       |

                                        +-------------------+----------+

 

             -> 쿼리캐시 상태보기

                           show status like 'qcache%';

 

                                        +-------------------------+----------+

                                        | Variable_name           | Value    |

                                        +-------------------------+----------+

                                        | Qcache_queries_in_cache | 12780    |  : 캐시에 등록된 쿼리수

                                        | Qcache_inserts          | 2084642  |    : 캐시에 추가된 쿼리수

                                        | Qcache_hits             | 173194   |     : 캐시에 있는 쿼리를 사용한 수

                                        | Qcache_lowmem_prunes    | 361897   |           

                                        | Qcache_not_cached       | 23724    |  : 쿼리를 캐시에 저장하지 않은 수

                                        | Qcache_free_memory      | 20055720 | : 캐시가 남은 공간

                                        | Qcache_free_blocks      | 6237     |   : 쿼리캐시에서 남은 메모리 블록

                                        | Qcache_total_blocks     | 32000    |    : 쿼리캐시가 사용하는 총 블록 수

                                        +-------------------------+----------+

             -> FLUSH

                           FLUSH QUERY CACHE 쿼리 캐시를 재정렬하므로 메모리를 유용하게 사용하도록 해준다.

                          (단 쿼리캐시를 비우지는 않는다)

            

                           FLUSH TABLES 쿼리 캐시 버퍼를 비운다.

                         ( Qcache_queries_in_cache = 0 , Qcache_table_blocks = 1

            

                           FLUSH QUERY CACHE 는 모든 쿼리 캐시를 삭제

            

 

 

             -- 로그설정

            

             log-isam=파일경로

             log-slow-queries=파일경로

             long_query_time=5

 

 

 

 EX ) MySQL 메모리 사용량

 

                           innodb_buffer_pool_size

             +            key_buffer

             +            max_connections * (join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)

             +            max_connections * 2MB

 

 

 

 

 

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

 

              튜닝참조

 

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

 

1. Opened_tables가 크면 table_cache variable의 값이 너무 작은것일지도 모른다

 

2. key_reads가 크면 key_cach의 값이 너무 작은것일지도 모른다

 

3. cache hit rate key_reads/key_read_requests이다

 

4. Handler_read_rnd가 크면 MySQL의 모든 테이블을 스캔하는 많은 쿼리가 있다거나 key를 적절히 사용하지 않는 조인들이 있을지 모른다

 

5. Threads_created가 크면 thread_cache_size값을 증가시키기를 바랄수도 있다

 

6. Created_tmp_disk_tables이 크면 디스크대신 임시테이블메모리를 얻기위해 tmp_table_size값을 증가시키기를 원할 수있다

 

7. 기본적으로 support-files밑에 my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf 를 기본으로 my.cnf 로 바꾸어 사용하면서 조정한다.

 

             - memory (>=256M)이고 많은 테이블이 있으며, 적당한 클라이언트수에서 최고 성능을 유지하기 위해

             shell> safe_mysqld -O key_buffer=64M -O table_cache=256 -O sort_buffer=4M -O record_buffer=1M &

             이러한 옵션으로 서버를 실행하는데, my-cnf에서 이를 수정하여 사용하면 될 것이다.

 

             - 128M메모리에 테이블이 적지만, 정렬이 많을 때

             shell> mysqld_safe -O key_buffer=16M -O sort_buffer=1M

 

             - 메모리는 적지만 많은 연결이 있을 때

             shell> mysqld_safe -O key_buffer=512k -O sort_buffer=100k -O record_buffer=100k &

             또는

             shell> mysqld_safe -O key_buffer=512k -O sort_buffer=16k -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &

 

 

8. group by order by작업이 가지고 있는 메모리보다 훨씬 클 경우, 정렬 후 row 읽는 것을 빠르게 하기위해 record_buffer값을 증가시켜라

 

[출처] my.cnf 설정파일|작성자 Agin


반응형

댓글()

mysql 튜닝 my.cnf 설정법

리눅스/MySQL|2015. 1. 16. 11:02
반응형

# MySQL 설정 File
# 작성 김정균
###########################################################################
#
# 이 파일에는 MySQL 의 전체적인 설정이 들어간다. [ client ] 설정은 각 유저
# 들의 홈디렉토리 ~user/.my.cnf 라는 파일로 만들어 설정을 할수 있다. 이 설
# 정 파일들의 퍼미션은 소유자 readonly 즉 600 을 유지해야 한다.
#
# 현설정 파일은 Plll 700 Mhz 에 RAM 512 M 를 기준으로 MySQL 전용 서버로 작
# 하는 경우를 기준으로 작성이 되어 있다. 각 시스템에 대한 설정은 아래의 파
# 일들을 참조 하도록 한다.
#
# PATH /usr/share/mysql
# my-huge.cnf MySQL 전용으로 메모리가 1-2G 일 경우
# my-large.cnf MySQL 전용으로 메모리가 512 이상일 경우
# my-medium.cnf MySQL 전용으로 메모리가 32-64M 정도일 경우나
# 메모리가 128 이상이면서 다른 데몬과 같이 서비스 될 경우
# my-small.cnf MySQL 전용으로 메모리가 64M 이하일 경우
#
# 메모리가 32M 보다 작을 경우에는 my.cnf 설정을 사용 하지 말고 디폴트 값을
# 사용하도록 한다.

###########################################################################
# MySQL Clinet 설정
###########################################################################
[client]
password = blahblah
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set = euckr

###########################################################################
# MySQL Server 설정
###########################################################################
# 다음 사항을 잘 고려하여 설정을 해야 한다.
# key_buffer_size+(record_buffer+sort_buffer)*max_connections <실메모리양
#
# key_buffer 는 실 메모리의 1/4 정도면 무난하다.
#
# 또한 table_cache 는
# (MaxFileOpen-MaxConnection-(temporary table 에 사용되는 파일핸들) ) / 2
# 을 고려하여 설정을 한다.(단 너무 크게 잡을 필요는 없으며 최대 동시 접속
# 자 수의 1.5-2 배 정도라고 생각하면 된다. 즉 500 으로 지정이 되어 있으면
# DB 의 테 # 이블의 총수가 500개 까지는 모두 캐싱이 가능하다. 위의 공식은
# 최대값이라 생각을 하면 된다.)
#
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
#skip-show-database
skip-locking
skip-name-resolve
#skip-networking
key_buffer = 512M
max_allowed_packet = 4M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
myisam_sort_buffer_size = 64M
thread_cache = 8
thread_stack = 126976
max_connections = 200
join_buffer_size = 1M

max_connect_errors = 1024
wait_timeout = 30
old_passwords = 0
#tmpdir = /dev/shm
#log_slow_queries = /var/log/mysql/slow.log

read_rnd_buffer_size = 8M
thread_cache_size = 8

# sql cache 사용
#
# query 캐쉬 사용 옵션
# 0 -> 사용안함
# 1 -> 사용함
# 2 -> 선택적 사용
http://www.mysql.com/doc/en/Query_Cache_Configuration.html 참고
query_cache_type = 1
query_cache_size = 512M
query_cache_limit = 2M

# CPU 갯수 * 2 를 해서 설정을 한다. 1 개일 경우에는 설정 필요가 없다.
thread_concurrency = 4

# Charset 설정
#
# 기본 언어셋 설정은 /etc/sysconfig/mysql 의 default_char 을 함
character-set-client-handshake = 0
#character-set-server = euckr
#default-collation = euckr_korean_ci
#init_connect = ’set names euckr’

# 메시지 언어 선택
language = /usr/share/mysql/korean/

# MySQL 의 리플리케이션 기능을 사용하기 위한 binary log 설정
#log-bin
#server-id = 1

# InnoDB 테이블 설정
#
# innodb 를 사용하지 않을 경우에는 아래를 설정한다.
skip-innodb

# innodb 를 위한 경로 설정
#innodb_data_home_dir = /var/lib/mysql/
#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
#innodb_log_group_home_dir = /var/log/mysql/
#innodb_log_arch_dir = /var/log/mysql/

# _buffer_pool_size 를 RAM 의 50-08% 정로도 설정한다. 하지만 이 경우 메모리
# 사용량을 너무 많이 잡아 먹을 수도 있으므로 어느정도 시스템 모니터링을 하도
# 록 한다.
#innodb_buffer_pool_size = 384M
#innodb_additional_mem_pool_size = 20M

# _log_file_size 는 buffer pool size 의 25% 정도로 설정한다.
#innodb_log_file_size = 100M
#innodb_log_buffer_size = 8M
#innodb_lock_wait_timeout = 50

# 0 => commit 시 로그 파일에 바로 기록 안함
# 1 => commit 시 로그 파일에 바로 기록
# 2 => commit 시 OS 레벨의 파일 캐쉬에 기록 (3.23.52 추가)
#innodb_flush_log_at_trx_commit = 2

###########################################################################
# MySQL dump 설정
###########################################################################
[mysqldump]
quick
max_allowed_packet = 16M

###########################################################################
# MySQL
###########################################################################
[mysql]
no-auto-rehash

###########################################################################
# Isamchk
###########################################################################
[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

###########################################################################
# Myisamchk
###########################################################################
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

###########################################################################
# Mysqlhotcopy
###########################################################################
[mysqlhotcopy]
interactive-timeout

# Local variables:
# tab-width: 4
# c-basic-offset: 4
# End:
# vim600: noet sw=4 ts=4 fdm=marker
# vim<600: noet sw=4 ts=4

 

 

[출처] PLUSONNET Community | admin (http://www.plusonnet.co.kr/plugins/wordpress/?p=72)

반응형

댓글()

MySQL 부하 체크 Slow Query // mysql_slow_log_filter , parser

리눅스/MySQL|2015. 1. 16. 11:01
반응형

대량의 데이터를 조회하거나

잘못된 인덱스 사용으로 인해 장시간 Mysql 프로세스가 물리는 현상이 발생 할 경우

어떤 쿼리문이 이런 현상을 야기 시켰느냐에 대한 분석 시

Slow Query 를 사용하시면 손 쉽게 부하가 증가되는 쿼리를 찾으실 수 있으실 것입니다.

 

<사용 방법>

1. mysql 환경 설정 파일인 my.cnf 파일에 아래 내용을 추가 하시면 됩니다.

 

[mysqld]
long_query_time=초제한(1~10)

log-slow-queries=로그파일명

 

ex)

[mysqld]

log-slow-queries = /temp/mysql-slow.log
long_query_time = 3

위의 의미는 쿼리타임이 3초를 초과하는 쿼리에 대해 /temp/mysql-slow.log 파일에 로그를 남기라는 의미 입니다.

 

2. mysql 구동시 적용하는 방법이 있습니다.

$ mysqld_safe --datadir=데이터디렉토리 --log-slow-queries[=file_name&

 

< 로그 파일의 내용 >

# Time: 080218 13:25:06
User@Host: XXXXX[xxxxx] @ localhost [127.0.0.1]
# Query_time: 8  Lock_time: 0  Rows_sent: 1  Rows_examined: 98767
use CrediMail;

SELECT count(*) FROM test

 

위의 양식으로 slow 쿼리가 남게 됩니다.

slow log 로 남은 쿼리들은 explain 을 사용하여 정상적인 index를 타고 있는지 체크 해 보는 방법으로

문제점을 찾아 가시면 될 것입니다.

ex) mysql>explain 문제시 되는 쿼리;

 

<참고>

Query_time : 쿼리 처리 시간

Lock_time : lock 이 걸린 횟수

Row_sent : 조회 결과 Row 수

Rows_examined : 조회 대상 Row 수

 

Reference URL

http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html

http://www.sitepoint.com/forums/showthread.php?t=397521

 
Setting my.cnf for log slow queries
 

MySQL을 운용하다보면 궁극적으로 봉착하는 문제가 바로 Slow queriy 다. 이 Slow query 야말로 모둔 query의 적이라 해도 과언이 아니라고 생각한다. MySQL에서는이 Slow query를 log로 기록할수 있게 되어있는데 이 설정이 꽤나 delicate 하다. 다음은 MySQL 5.0에서 동작하는 설정이다.

1. Check the gloval variables

in the mysql command prompt,

show global variables WHERE Variable_name LIKE ‘l%’;

+???????????+?????????+
| Variable_name | Value |
+???????????+?????????+
| language | /usr/share/mysql/english/ |
| large_files_support | ON |
| large_page_size | 0 |
| large_pages | OFF |
| license | GPL |
| local_infile | ON |
| locked_in_memory | OFF |
| log | OFF |
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| log_error | |
| log_slave_updates | OFF |
| log_slow_queries | ON |
| log_warnings | 1 |
| long_query_time | 3 |
| low_priority_updates | OFF |
| lower_case_file_system | OFF |
| lower_case_table_names | 0 |
+???????????+?????????+

2. Configuration

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# added 1007/10/05
max_connections = 10000
table_cache = 256
wait_timeout = 900
max_connect_errors = 10000
key_buffer = 16M
sort_buffer = 1M
set-variable = long_query_time=3
log-slow-queries=/var/log/mysqld-slow.log

[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
log-error=/var/log/mysqld.log
#log-slow-queries=/var/log/mysqld-slow.log
pid-file=/var/run/mysqld/mysqld.pid

# added 2007/10/05
#set-variable = long_query_time=3
#log-slow-queries=/var/log/mysqld-slow.log

 

Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

  --verbose    verbose
  --debug      debug
  --help       write this text to standard output

  -v           verbose
  -d           debug
  -s ORDER     what to sort by (t, at, l, al, r, ar etc), 'at' is default
  -r           reverse the sort order (largest last instead of first)
  -t NUM       just show the top n queries
  -a           don't abstract all numbers to N and strings to 'S'
  -n NUM       abstract numbers with at least n digits within names
  -g PATTERN   grep: only consider stmts that include this string
  -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
               default is '*', i.e. match all
  -i NAME      name of server instance (if using mysql.server startup script)
  -l           don't subtract lock time from total time

 

 

Slow query filter

http://www.mysqlperformanceblog.com/files/utils/mysql_slow_log_filter

 

용도  : slow query log 에서 실행 시간이 일정 시간 이상이 되는 쿼리 와 일정 row 이상 access하는 쿼리만 filter 해 낼 수 있음

 

사용법

 

cat slow query log msql_slow_log_filter -T timesec -R numrows  ( T, R option은 단독으로 사용할 수 있음 )

Ex)

cat  kidsmbbs1-slow.log | msql_slow_log_filter  -R 400000  ( 400000 row 이상 access 하는 쿼리만 추출 )

 

SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb_comment_121`;

# Time: 070307  5:01:11

# Query_time: 4  Lock_time: 0  Rows_sent: 31864  Rows_examined: 455198

select distinct code from tb_comment_121;

# Time: 070307  5:06:17

# Query_time: 5  Lock_time: 0  Rows_sent: 455596  Rows_examined: 455596

SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb_comment_121`;

# Time: 070308  5:01:09

# Query_time: 4  Lock_time: 0  Rows_sent: 31905  Rows_examined: 455596

select distinct code from tb_comment_121;

 

cat  kidsmbbs1-slow.log | msql_slow_log_filter  -T 8  ( 8초 이상 걸리는 쿼리만 추출 )

 

SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb_bbs_154`;

# Time: 070306  5:00:40

# Query_time: 8  Lock_time: 0  Rows_sent: 1  Rows_examined: 329849

select count(indexno) as su from tb_comment_160 where wdate>=1173020400 and wdate<=1173106800;

# Time: 070306 14:13:22

# Query_time: 15  Lock_time: 0  Rows_sent: 37014  Rows_examined: 37014

SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb_bbs_154`;

# Time: 070307  5:00:40

# Query_time: 14  Lock_time: 0  Rows_sent: 37014  Rows_examined: 37014

SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb_bbs_154`;

 

Aggregating slow query log

http://www.mysqlperformanceblog.com/files/utils/mysql_slow_log_parser

 

용도 : slow query log 에 있는 slow query에 대해서 aggregate 한 정보를 보여줌즉 실행 횟수평균 수행 시간총 수행 시간 , access 한 rows  , 개인적으로 mysqldumpslow 보다 보기  좋은 것 같습니다.

 

### 4 Queries

### Total time: 12, Average time: 3

### Taking 3 , 3 , 3 , 3  seconds to complete

### Rows analyzed 144673, 150153, 185656 and 189447

SELECT /*!XXX SQL_NO_CACHE */ * FROM `tb_bbs_limit`;

 

SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb_bbs_limit`;

 

 

### 2 Queries

### Total time: 10, Average time: 5

### Taking 5 , 5  seconds to complete

### Rows analyzed 78261 and 81439

use ykids_bbs;

SELECT /*!XXX SQL_NO_CACHE */ * FROM `tb_bbs_XXX`;

 

 

[출처] hi.pe.kr 날으는 물고기 | 물고기 (http://naver.pages.kr/140051335615)


반응형

'리눅스 > MySQL' 카테고리의 다른 글

my.cnf 설정파일  (0) 2015.01.16
mysql 튜닝 my.cnf 설정법  (0) 2015.01.16
mysql 두개 동시에 사용하기  (0) 2015.01.16
MySQL Replication (리플리케이션)  (0) 2015.01.16
[oracle] oracle 구동  (0) 2015.01.16

댓글()

mysql 두개 동시에 사용하기

리눅스/MySQL|2015. 1. 16. 10:59
반응형

기존에 mysql 4.0.x 을 사용하면서 mysql 5.x를 추가 설치할때를 기준으로 작성하였습니다.

 

1. mysql 5 설치

    mysql 5 를 다른 디렉토리로 설치 합니다.

 

    예) 설치 위치 : /usr/local/mysql5

           # ./configure --prefix=/usr/local/mysql5 --localstatedir=/usr/local/mysql5/data --with-charset=euc_kr --with-mysql-user=mysql --with-extra-charsets=all --with-pthread --with-named-thread-lib=-lpthread --with-unix-socket-path=/tmp/mysql5.sock --with-tcp-port=3307

           # make

           # make install

 

           기타 DB생성 및 퍼미션 설정

           # scripts/mysql_install_db
           # chown -R mysql:mysql /usr/local/mysql5
           # chown -R mysql:mysql /usr/local/mysql5/data
           # cp support-files/my-huge.cnf /etc/my5.cnf
           # chmod 711 /usr/local/mysql5
           # chmod 700 /usr/local/mysql5/data
           # chmod 751 /usr/local/mysql5/bin
           # chmod 750 /usr/local/mysql5/bin/*
           # chmod 755 /usr/local/mysql5/bin/mysql
           # chmod 755 /usr/local/mysql5/bin/mysqldump

 

          [반대로 5.x 를 사용하다 4.0.x 를 추가 설치 할 경우]

          # ./configure --prefix=/usr/local/mysql4 --localstatedir=/usr/local/mysql4/data --with-charset=euc_kr --with-mysql-user=mysql --with-extra-charsets=all --with-pthread --with-named-thread-lib=-lpthread --with-unix-socket-path=/tmp/mysql4.sock

 

 

2. 파일 수정

    /usr/local/mysql5/bin/mysqld_safe

    /usr/local/mysql5/share/mysql/mysql.server

 

   위의 두개의 파일을 편집기로 열어 아래와 같이 수정합니다.

 

    /etc/my.cnf 는 /etc/my5.cnf 로

    /tmp/mysql.sock 은 /tmp/mysql5.sock 으로 변경, 저장 합니다.

  

    /etc/ld.so.conf 파일에 아래 내용 추가

    /usr/local/mysql5/include/mysql
    /usr/local/mysql5/lib/mysql

 

    위 두줄 추가 저장 후, ldconfig 를 실행 합니다.

    # ldconfig

 

 

3. 운영 방법

    1) mysql 5 구동
    # /usr/local/mysql5/bin/mysqld_safe --defaults-file=/etc/my5.cnf --socket=/tmp/mysql5.sock --pid-file=/usr/local/mysql5/data/localhost.pid --port=3307 --datadir=/usr/local/mysql5/data --basedir=/usr/local/mysql5 &

 

    /usr/local/mysql5/share/mysql/mysql.server 파일을 /etc/init.d/mysqld5 파일로 복사하여 vi 로 실행파일 스크립트를

    적절히 수정하면 손쉽게 구동, 중지가 됩니다. (start 부분만 위에 구동 형식으로 수정하면 됩니다.)

 

    2) mysql 5 접속
    # mysql -u root -p -S /tmp/mysql5.sock

 

    3) mysql 5 데몬 종료
    # mysqladmin -u root -p -S /tmp/mysql5.sock shutdown

 

    4) 소켓 설정

    mysql 5 를 사용하는 홈페이지는 virtualhost 설정에
    php_value mysql.default_socket '/tmp/mysql5.sock' 를 포함해야 합니다.


     ※ 또는 홈페이지 소스의 mysql_connect 부분전에 소켓 설정을 해줍니다.

           $sock = "/tmp/mysql5.sock"; 
           ini_set('mysql.default_socket',$sock);

반응형

댓글()

MySQL Replication (리플리케이션)

리눅스/MySQL|2015. 1. 16. 10:59
반응형

MySQL Replicaton 은 DB 서버를 여러대 두고 웹서버로 부터의 접속(쿼리, select)을 분산 시켜

DB서버의 부하를 줄이는 방법입니다.

slave 서버에서 master 서버의 바이너리 로그파일을 참조하여 업데이트 하므로,

slave 서버에 로그인하여 DB를 update 하면 동기화가 되지 않으니

slave 서버는 select 용도로만 사용을 해야 합니다.

 

두대의 MySQL 버전이 다를 경우, slave 서버의 버전이 더 높아야 합니다.

(버전에 따라 점차 기능이 많아 지므로..)

 

최대한 간단히 작성하려 하였습니다.

순서대로 따라만 하시면 누구나 손쉽게 구축이 가능합니다. ^^

 

 

1. master 서버 설정

mysql 설정 파일을 열어 아래 두개 항목이 사용중인지 확인합니다.

 

vi /etc/my.cnf

[mysqld]

log-bin=mysql-bin

server-id   = 1           <- 서버 고유 번호이므로 slave 서버와 같으면 안됩니다.

 

저장 후, mysql 을 재시작 해줍니다.

/etc/init.d/mysqld restart

 

mysql 에 로그인하여 slave 서버에서 접속할 사용자 생성을 합니다.

 

mysql -p

(mysql root 패스워드 입력)

mysql> use mysql;

mysql> grant replication slave on *.* to 'repluser'@'192.168.0.10' identified by 'sysdocu1234';

 

※ repluser : 리플리케이션 설정 목적을 위한 mysql 계정

    192.168.0.10 : slave 서버 IP 입니다. 여기서는 지정한 IP 에서만 접속되게 설정하였습니다.

    sysdocu1234 : 접속계정의 패스워드 입니다.

 

 

2. slave 서버 설정

mysql 설정 파일을 열어 아래 두개 항목이 사용중인지 확인합니다.

 

vi /etc/my.cnf

[mysqld]

log-bin=mysql-bin

server-id   = 2           <- 서버 고유 번호이므로 master 서버와 같으면 안됩니다.

 

저장 후, mysql 을 재시작 해줍니다.

/etc/init.d/mysqld restart

 

 

3. 동기화 작업 

1차적으로 master 서버의 MySQL data 폴더를 master 서버로 복사 해옵니다.

dump 로 가져오셔도 되고, rsync 로 복사해오셔도 됩니다. (rsync는 MySQL 버전이 같을때만 사용합니다.)

방법은 본 메뉴얼에서 생략합니다.


MySQL의 경우 data 디렉토리에 로그파일도 존재 하지만 Ubuntu 의 MariaDB 사용시

data 및 log 디렉토리가 별도 존재 하므로 두개의 디렉토리를 각각 전송 해주어야 합니다.


data 복사가 되었으면, master 서버의 mysql 에 로그인 하여 로그 파일 상태를 확인합니다.

 

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 |      813 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

 

이제 slave 서버의 mysql 에 로그인 하여 지정한 로그부터 연동이 되게 설정합니다.

 

mysql> stop slave;

mysql> reset slave;

mysql> change master to master_host='192.168.0.9', master_user='repluser', master_port=3306, master_password='sysdocu1234', master_log_file='mysql-bin.000010', master_log_pos=813;

mysql> start slave;

 

※ 192.168.0.9 : master 서버 IP 입니다.

    mysql-bin.000010 : master 서버에서 확인한 바이너리 로그파일명 입니다. MariaDB는 파일명이 다르니 잘 보고 입력해야 합니다.

    813 : master 서버에서 확인한 바이너리 파일의 최종 쿼리 위치 입니다.

             여기서부터 master 서버에 쿼리 발생시 slave 서버도 같이 동작합니다.

 

 

4. 테스트

master 서버에서 테이블을 한개 생성합니다.

 

mysql> use test;

mysql> create table sysdocu ( no int(8), primary key (no) );

mysql> show tables;

 

slave 서버에서도 같은 database (test) 에 sysdocu 이라는 table 이 생성된 것을 확인할 수 있습니다.

slave 서버에서 확인해봅니다. 

 

mysql> show tables;

 

같은 형식으로 여러대(1:N)의 replication 을 구성할 수 있으며, (주의 : my.cnf 파일의 server-id 만 각각 다르게 설정)

MySQL 구동 순서는 master 서버, slave 서버 순입니다.



* 참고 (테스트 결과)

1) slave 서버 재구동 시 : replication 유지

2) master 서버 재구동 시 : replication 해제

3) slave 서버 리부팅 되는 동안 master 데이터 변경 된 것은 slave 서버가 부팅 완료되고 자동으로 sync 맞춰짐




반응형

댓글()

[oracle] oracle 구동

리눅스/MySQL|2015. 1. 16. 10:59
반응형

# su - oracle
[oracle@localhost ~]$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on Tue Sep 22 12:08:12 2009

Copyright (c) 1982, 2004, Oracle.  All rights reserved.

SQL> connect /as sysdba
Connected.
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  188743680 bytes
Fixed Size                   778312 bytes
Variable Size             161750968 bytes
Database Buffers           25165824 bytes
Redo Buffers                1048576 bytes
Database mounted.
Database opened.
SQL> exit

Disconnected from Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options

[oracle@localhost ~]$ cd product/10.1.0/db_1/bin
[oracle@localhost ~]$ ./lsnrctl stop


LSNRCTL for Linux: Version 10.1.0.3.0 - Production on 22-SEP-2009 12:08:52

Copyright (c) 1991, 2004, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))

The command completed successfully

[oracle@localhost ~]$ ./lsnrctl start

반응형

댓글()

mysql 로그인 상태에서 외부 파일 실행

리눅스/MySQL|2015. 1. 16. 10:58
반응형

쿼리가 있는 파일을 data 홈디렉토리에 넣고 실행하면 됩니다.

 

mysql> ₩. 파일이름

반응형

댓글()