MySQL Server – Break Point !!

MySQL 클라이언트에서 MySQL Protocol / Payload  를 보던, Trace 를 해보든…

어딘가에 Break Point 를 잡아야 하는데, MySQL Client 는 그냥저냥 따라가면 쉽지만…

MySQL Server 는 어디를 어떻게 잡아야 할지 난감합니다. Multi-Process 기반이 Multi-Thread 기반보다는 Debugging 이 용이하죠. 물론 와리가리하는 경우는 반대로 Multi-Thread 가 더 편하고요.

참고 :

https://oxnz.github.io/2016/07/20/mysql-primer-source/#connection

 

MySQL 은 handler connection manager 가 말그대로 connection 을 처리하기 때문에 가장 먼저 잡으시면 됩니다. ( thread 이름으로 충분히 추측이 가능하기 때문에 필요에 따라서 각 thread 에 break point 를 잡으셔서 활용하시면 편합니다. )

MySQL Server – Break Point !!

슬라이드11

 

MySQL Client -> Server 로 Command 란 프로토콜?! 으로 Server Side 에 각 프로세스를 진행합니다.  MySQL Source 에서 원하는 곳을 검색하거나, Trace 할 때 용이합니다.

my_command.h

/* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */

#ifndef _mysql_command_h
#define _mysql_command_h

/**
@enum enum_server_command
@brief You should add new commands to the end of this list, otherwise old
servers won’t be able to handle them as ‘unsupported’.
*/
enum enum_server_command
{
COM_SLEEP,
COM_QUIT,
COM_INIT_DB,
COM_QUERY,
COM_FIELD_LIST,
COM_CREATE_DB,
COM_DROP_DB,
COM_REFRESH,
COM_SHUTDOWN,
COM_STATISTICS,
COM_PROCESS_INFO,
COM_CONNECT,
COM_PROCESS_KILL,
COM_DEBUG,
COM_PING,
COM_TIME,
COM_DELAYED_INSERT,
COM_CHANGE_USER,
COM_BINLOG_DUMP,
COM_TABLE_DUMP,
COM_CONNECT_OUT,
COM_REGISTER_SLAVE,
COM_STMT_PREPARE,
COM_STMT_EXECUTE,
COM_STMT_SEND_LONG_DATA,
COM_STMT_CLOSE,
COM_STMT_RESET,
COM_SET_OPTION,
COM_STMT_FETCH,
COM_DAEMON,
COM_BINLOG_DUMP_GTID,
COM_RESET_CONNECTION,
/* don’t forget to update const char *command_name[] in sql_parse.cc */

/* Must be last */
COM_END
};

#endif /* _mysql_command_h */

 

my_sqlcommand.h

/* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */

#ifndef _mysql_sql_command_h
#define _mysql_sql_command_h

/*
@enum enum_sql_command
@brief SQL Commands

SQL Command is resolved during SQL parsing and assigned to the Lex
object, accessible from the THD.

When a command is added here, be sure it’s also added in mysqld.cc
in “struct show_var_st status_vars[]= {” …

If the command returns a result set or is not allowed in stored
functions or triggers, please also make sure that
sp_get_flags_for_command (sp_head.cc) returns proper flags for the
added SQLCOM_.
*/
enum enum_sql_command {
SQLCOM_SELECT,
SQLCOM_CREATE_TABLE,
SQLCOM_CREATE_INDEX,
SQLCOM_ALTER_TABLE,
SQLCOM_UPDATE,
SQLCOM_INSERT,
SQLCOM_INSERT_SELECT,
SQLCOM_DELETE,
SQLCOM_TRUNCATE,
SQLCOM_DROP_TABLE,
SQLCOM_DROP_INDEX,
SQLCOM_SHOW_DATABASES,
SQLCOM_SHOW_TABLES,
SQLCOM_SHOW_FIELDS,
SQLCOM_SHOW_KEYS,
SQLCOM_SHOW_VARIABLES,
SQLCOM_SHOW_STATUS,
SQLCOM_SHOW_ENGINE_LOGS,
SQLCOM_SHOW_ENGINE_STATUS,
SQLCOM_SHOW_ENGINE_MUTEX,
SQLCOM_SHOW_PROCESSLIST,
SQLCOM_SHOW_MASTER_STAT,
SQLCOM_SHOW_SLAVE_STAT,
SQLCOM_SHOW_GRANTS,
SQLCOM_SHOW_CREATE,
SQLCOM_SHOW_CHARSETS,
SQLCOM_SHOW_COLLATIONS,
SQLCOM_SHOW_CREATE_DB,
SQLCOM_SHOW_TABLE_STATUS,
SQLCOM_SHOW_TRIGGERS,
SQLCOM_LOAD,
SQLCOM_SET_OPTION,
SQLCOM_LOCK_TABLES,
SQLCOM_UNLOCK_TABLES,
SQLCOM_GRANT,
SQLCOM_CHANGE_DB,
SQLCOM_CREATE_DB,
SQLCOM_DROP_DB,
SQLCOM_ALTER_DB,
SQLCOM_REPAIR,
SQLCOM_REPLACE,
SQLCOM_REPLACE_SELECT,
SQLCOM_CREATE_FUNCTION,
SQLCOM_DROP_FUNCTION,
SQLCOM_REVOKE,
SQLCOM_OPTIMIZE,
SQLCOM_CHECK,
SQLCOM_ASSIGN_TO_KEYCACHE,
SQLCOM_PRELOAD_KEYS,
SQLCOM_FLUSH,
SQLCOM_KILL,
SQLCOM_ANALYZE,
SQLCOM_ROLLBACK,
SQLCOM_ROLLBACK_TO_SAVEPOINT,
SQLCOM_COMMIT,
SQLCOM_SAVEPOINT,
SQLCOM_RELEASE_SAVEPOINT,
SQLCOM_SLAVE_START,
SQLCOM_SLAVE_STOP,
SQLCOM_START_GROUP_REPLICATION,
SQLCOM_STOP_GROUP_REPLICATION,
SQLCOM_BEGIN,
SQLCOM_CHANGE_MASTER,
SQLCOM_CHANGE_REPLICATION_FILTER,
SQLCOM_RENAME_TABLE,
SQLCOM_RESET,
SQLCOM_PURGE,
SQLCOM_PURGE_BEFORE,
SQLCOM_SHOW_BINLOGS,
SQLCOM_SHOW_OPEN_TABLES,
SQLCOM_HA_OPEN,
SQLCOM_HA_CLOSE,
SQLCOM_HA_READ,
SQLCOM_SHOW_SLAVE_HOSTS,
SQLCOM_DELETE_MULTI,
SQLCOM_UPDATE_MULTI,
SQLCOM_SHOW_BINLOG_EVENTS,
SQLCOM_DO,
SQLCOM_SHOW_WARNS,
SQLCOM_EMPTY_QUERY,
SQLCOM_SHOW_ERRORS,
SQLCOM_SHOW_STORAGE_ENGINES,
SQLCOM_SHOW_PRIVILEGES,
SQLCOM_HELP,
SQLCOM_CREATE_USER,
SQLCOM_DROP_USER,
SQLCOM_RENAME_USER,
SQLCOM_REVOKE_ALL,
SQLCOM_CHECKSUM,
SQLCOM_CREATE_PROCEDURE,
SQLCOM_CREATE_SPFUNCTION,
SQLCOM_CALL,
SQLCOM_DROP_PROCEDURE,
SQLCOM_ALTER_PROCEDURE,
SQLCOM_ALTER_FUNCTION,
SQLCOM_SHOW_CREATE_PROC,
SQLCOM_SHOW_CREATE_FUNC,
SQLCOM_SHOW_STATUS_PROC,
SQLCOM_SHOW_STATUS_FUNC,
SQLCOM_PREPARE,
SQLCOM_EXECUTE,
SQLCOM_DEALLOCATE_PREPARE,
SQLCOM_CREATE_VIEW,
SQLCOM_DROP_VIEW,
SQLCOM_CREATE_TRIGGER,
SQLCOM_DROP_TRIGGER,
SQLCOM_XA_START,
SQLCOM_XA_END,
SQLCOM_XA_PREPARE,
SQLCOM_XA_COMMIT,
SQLCOM_XA_ROLLBACK,
SQLCOM_XA_RECOVER,
SQLCOM_SHOW_PROC_CODE,
SQLCOM_SHOW_FUNC_CODE,
SQLCOM_ALTER_TABLESPACE,
SQLCOM_INSTALL_PLUGIN,
SQLCOM_UNINSTALL_PLUGIN,
SQLCOM_BINLOG_BASE64_EVENT,
SQLCOM_SHOW_PLUGINS,
SQLCOM_CREATE_SERVER,
SQLCOM_DROP_SERVER,
SQLCOM_ALTER_SERVER,
SQLCOM_CREATE_EVENT,
SQLCOM_ALTER_EVENT,
SQLCOM_DROP_EVENT,
SQLCOM_SHOW_CREATE_EVENT,
SQLCOM_SHOW_EVENTS,
SQLCOM_SHOW_CREATE_TRIGGER,
SQLCOM_ALTER_DB_UPGRADE,
SQLCOM_SHOW_PROFILE,
SQLCOM_SHOW_PROFILES,
SQLCOM_SIGNAL,
SQLCOM_RESIGNAL,
SQLCOM_SHOW_RELAYLOG_EVENTS,
SQLCOM_GET_DIAGNOSTICS,
SQLCOM_ALTER_USER,
SQLCOM_EXPLAIN_OTHER,
SQLCOM_SHOW_CREATE_USER,
SQLCOM_SHUTDOWN,
SQLCOM_ALTER_INSTANCE,
/* This should be the last !!! */
SQLCOM_END
};

#endif /* _mysql_sql_command_h */

 

 

 

 

 

Advertisements

Adding a custom file type in Vim

vim_cheat_sheet_for_programmers_print

Linux Programmer 자리에서 쉽게 찾아 볼 수 있는 Vim Cheat Sheet 입니다!!  이 글은 Emacs 파는 skip 하셔도 됩니다. ^^;

0. Syntax Hightlight

이 글은 “우리만의 log format”, “SQL 같은 Syntax  를 지원하는”, “Unknown File Format” 등을 highlight 없이 무미건조하게 보다는 경우를 위해서 Vim Syntax Hightlight 적용방법을 설명합니다. 실제로 개발, 디버깅을 하다보면 apps.log , apps.log.1 , proc1.xlog , … 등 별의별 파일을 tail -f , grep , 등등 모니터링하고, 분석하고, 열었다가 닫았다가 하다보면 눈이 핑핑돌곤 합니다. 이럴 때에 syntax highlight 까지 안되어 있으면 정말 별거 아닌 오타를 놓쳐서 엄청난 시간을 남비하는 경우가 다반사입니다. “i” 와 “I” 를 대소문자 에러가 웃습다고 생각하지만, 실제로 이런 경우가 다반사입니다.

다음은 /var/log/message 파일 syntax on / off 일 때입니다.   ” IP Adress 들을 체크해보세요!! “

: syntax on 

snag-0011-2016-09-14-%ec%98%a4%ec%a0%84-2-59-20

: syntax clear

snag-0012-2016-09-14-%ec%98%a4%ec%a0%84-2-59-38

본 글에서는 *.xlog 란 가상의 파일에 대한  Vim syntax highlight 를 만들어서 추가하여 보겠습니다.

1. SQL >= MySQL

본격적인 설명에 들어가기 앞서서 SQL 이란 좋은 예제가 있어서 설명을 드립니다.

많은 분들이 잘 아시겠지만, Vim 은 다양한 파일의 syntax highlight 를 제공합니다.  그리고, 필요에 따라서 기본에 syntax file 을 custom 하여 사용하기도 합니다.

$ ls /usr/share/vim/vim74/syntax | wc -l

566

SAP HANA 는 불과 몇년전까지 없는 제품인데, saphava.vim 이 추가 되어 있습니다. ( 필자는 이런 식으로 제가 근무했던 회사의 SQL.vim 을 만들어서 사용하였습니다. )

$ ls /usr/share/vim/vim74/syntax/*sql*

esqlc.vim  msql.vim  mysql.vim  plsql.vim  sqlanywhere.vim  sqlforms.vim

sqlhana.vim  sqlinformix.vim  sqlj.vim  sqloracle.vim  sql.vim

그리고, 파일 확장자 ( file extension )으로 syntax highlight 가 적용되기 때문에, 확장자는 매우 중요합니다. file format 을 잘모를 경우에는 최대한 유사한 syntax file 을 찾아서 사용하는 것도 한 방법입니다.

LIMIT Clause 는 MySQL Syntax 이고, ROWNUM pseudocolumn 은 Oracle Syntax 입니다.

SELECT *
FROM tbl
LIMIT 0, 100;

SELECT *
FROM tbl
WHERE ROWNUM < 11
ORDER BY last_name;

*.SQL 파일은 기본적으로 sqloracle.vim 을 포함하고 있기 때문에 기본적으로 ROWNUM 이 highlight 되어서 보이고 있고, LIMIIT Clause 는 MySQL Syntax 이기 때문에 *.SQL 파일형식에서는 highlight 가 되고 있지 않습니다.

snag-0009-2016-09-14-%ec%98%a4%ec%a0%84-2-44-30

다음과 같이 file extension 을 TEST.mysql 로 하거나, Vim 에서 :set filetype=mysql 으로 변경해주면, LIMIT 과 ROWNUM 의 highlight 가 변경됩니다.

$ vim TEST.mysql 

or

: set filetype=mysql

snag-0010-2016-09-14-%ec%98%a4%ec%a0%84-2-44-47

2. New FileType 

모든 작업전에 backup 파일을 반드시 복사하시길 바랍니다. 여차하면 Vim 설정 어디를 고쳤는지 모르기 때문에 재설치를 해야 하는 경우가 발생합니다. ( 열어보는 파일도 backup 해주면 좋습니다. 만일의 하나를 위해서… )

$ cp /usr/share/vim/vim74/filetype.vim /usr/share/vim/vim74/filetype.vim.bak

file extension 을 추가해줍니다. 알파벳 ( Alphabet ) 순으로 정렬되어 있기 때문에 적당한 적당한 위치를 추가하여 줍니다. 자세한 내용은 Vim help 를 통해서… ( 저도 잘 모릅니다. ㅠㅠ )

$ vim /usr/share/vim/vim74/filetype.vim

2404 " Xslt
2405 au BufNewFile,BufRead *.xsl,*.xslt setf xslt
2406
2407 " xlog
2408 au BufNewFile,BufRead *.xlog setf xlog
2409
2410 " Yacc
2411 au BufNewFile,BufRead *.yy setf yacc

3. New xlog.vim 

TEST 파일을 생성합니다.

$ vim TEST.xlog 

2016-09-13 11:00:00 [STAT] DEV_01 "Good"
2016-09-13 12:00:00 [INFO] DEV_01 "This is S.P.A.R.T.A"
2016-09-13 12:01:00 [WARN] DEV_01 "PopIt"
2016-09-13 12:02:00 [ERRO] DEV_01 "Hello World"
2016-09-13 12:02:30 [STAT] DEV_02 "Hello World"
2016-09-13 12:03:00 [INFO] DEV_03 "..."
2016-09-13 12:04:00 [WARN] LIVE_01 "..."
2016-09-13 12:05:00 [INFO] DEV_02 "..."
2016-09-13 12:05:30 [WARN] DEV_02 "..."
2016-09-13 12:06:00 [FATA] DEV_03 "===== FATAL ====="
2016-09-13 12:07:00 [EXCE] DEV_04 "..."
2016-09-13 12:08:00 [EXIT] LIVE_02 "The End."

TEST 파일에서 다음과 같은 부분을 syntax highlight 하고 싶을 때

  1. INFO, WARN, EXCE, ERRO, FATA, EXIT, STAT
  2. LIVE_*  ( LIVE_01, LIVE_11, … )
  3. “…” 

이제 syntax file 을 만듭니다. 필요한건 566 개의 *.vim 파일들을 열어 보셔서 필요한 RE ( Regular Expression ) 이나 Role 을 copy & paste 하시면 됩니다.

$ vim /usr/share/vim/vim74/syntax/xlog.vim

" Vim syntax file
" This is a GENERATED FILE. Please always refer to source file at the URI below.
" Language: xlog file
" Maintainer: sql2
" Last Change: 2016-09-15
" URL: http://popit.kr/sql2

" Setup
if version >= 600
        if exists("b:current_syntax")
                finish
        endif
else
        syntax clear
endif

syn case ignore

" INFO LEVEL
syntax keyword xlogInfo            INFO WARN
syn    keyword xlogErro            EXCE ERRO FATA EXIT
syn    keyword xlogStat            STAT

" Server Name
syn    match   xlogLive            "LIVE_\w*"

" STRING
syn    region  xlogString           start=+"+    end=+"+ contains=@Spell

highlight default link xlogInfo     Type
hi        def     link xlogErro     Error
hi        def     link xlogStat     Type
hi        def     link xlogLive     Special
hi        def     link xlogString   String


let b:current_syntax = "xlog"

자세한 설명은 필요가 없을 정도로 간단합니다. 10분만 쳐다보시면 금방 보입니다. ^^;

http://vimdoc.sourceforge.net/htmldoc/syntax.html

INFO, WARN, EXCE, ERRO, FATA, EXIT, STAT 과 같은 키워드 ( keyword ) 는 다음과 같은 형식으로 작성해주시면 됩니다.

sy[ntax]  , keyword, hi[ghlight] , de[fault] 는 모두 예약어 ( reserved word ) 입니다.

5. Definig a syntax

:sy[ntax] keyword {group-name} [{options}] {keyword} .. [{options}]

Server name 과 같은 경우는 RE ( Regular Expression ) 형식으로 작성해주시면 됩니다.

5. Definig a syntax

:sy[ntax] match {group-name} [{options}] [excludenl] {pattern} [{options}]

color 지정은 다음과 같이 해주시면 됩니다. 실제로는 group 을 지정되는 겁니다.  syncolor.vim 에서 해당 group 에 대한 color 가 설정되어 있습니다. )

13. Linking groups

:hi[ghlight][!] [default] link {from-group} {to-group}

Type, Error, Special, String 은 이미 정해진 color group 입니다.  필요한 syntax color 는 다음을 참고하시면 됩니다.

$ vim /usr/share/vim/vim74/syntax/syncolor.vim

TEST 파일을 열어 보시면 다음과 같이 syntax highlight 가 적용되었습니다.

snag-0007-2016-09-14-%ec%98%a4%ec%a0%84-2-39-36

잘하시는 분은 저도 좀 알려주세요. 잉여력 부족!! ㅠㅠ

참고 :

http://vimdoc.sourceforge.net/htmldoc/syntax.html