:meta-keywords: cubrid logging, slow query, error log, deadlock detect, cubrid fail-over, cubrid fail-back :meta-description: Troubleshoot CUBRID database and High Availability nodes by consulting logs. ********** 트러블슈팅 ********** .. _sql-log-check: SQL 로그 í™•ì¸ ============= CASì˜ SQL 로그 -------------- íŠ¹ì • 오류가 ë°œìƒí–ˆì„ 때 보통 브로커 ì‘ìš© 서버(CAS)ì˜ SQL 로그를 확ì¸í•œë‹¤. ê° CAS 당 í•˜ë‚˜ì˜ SQL 로그 파ì¼ì´ ìƒì„±ë˜ëŠ”ë°, CAS 프로세스가 ë§Žì€ í™˜ê²½ì—서는 SQL ë¡œê·¸ë„ ë§Žì•„ì§€ë¯€ë¡œ 오류가 ë°œìƒí•œ SQL 로그 파ì¼ì„ 찾기가 ì–´ë µë‹¤. 하지만, SQL 로그 íŒŒì¼ ì´ë¦„ì€ ë’·ë¶€ë¶„ì— CAS ID를 í¬í•¨í•˜ê³ 있기 ë•Œë¬¸ì— ì˜¤ë¥˜ ë°œìƒ ì§ˆì˜ë¥¼ 수행한 CASì˜ ID를 알면 SQL 로그 파ì¼ì„ 찾기 쉽다. .. note:: CASì˜ SQL 로그 파ì¼ì€ <broker_name>_<app_server_num>.sql.log으로 ì €ìž¥ë˜ëŠ”ë°(:ref:`broker-logs` ì°¸ê³ ), <app_server_num>ì´ CAS IDì´ë‹¤. CAS ì •ë³´ ì¶œë ¥ 함수 ------------------ :func:`cci_get_cas_info` 함수 ë˜ëŠ” :ref:`JDBCì˜ cubrid.jdbc.driver.CUBRIDConnection í´ëž˜ìŠ¤ì˜ toString() 메서드 <jdbc-con-tostring>`)는 질ì˜ë¥¼ ìˆ˜í–‰í• ë•Œ 해당 질ì˜ê°€ ìˆ˜í–‰ëœ ë¸Œë¡œì»¤ì˜ í˜¸ìŠ¤íŠ¸ì™€ CAS ID를 í¬í•¨í•œ ì •ë³´ë¥¼ ì¶œë ¥í•˜ì—¬, ì´ë¥¼ 통해 해당 CASì˜ SQL 로그 파ì¼ì„ 쉽게 ì°¾ì„ ìˆ˜ 있다. :: <host>:<port>,<cas id>,<cas process id> 예) 127.0.0.1:33000,1,12916 ì‘ìš© 프로그램 로그 ------------------ ì‘ìš© 프로그램ì—서 로그를 ì¶œë ¥í•˜ë„ë¡ ì—°ê²° URLì„ ì„¤ì •í•˜ë©´ íŠ¹ì • 질ì˜ì—서 오류가 ë°œìƒí–ˆì„ 때 해당 오류가 ë°œìƒí•œ CAS ID를 확ì¸í• 수 있다. ì—러가 ë°œìƒí–ˆì„ 때 작성ë˜ëŠ” ì‘ìš© 프로그램 ë¡œê·¸ì˜ ì˜ˆëŠ” 다ìŒê³¼ 같다. **JDBC ì‘ìš© 프로그램 로그** :: Syntax: syntax error, unexpected IdName [CAS INFO - localhost:33000,1,30560],[SESSION-16],[URL-jdbc:cubrid:localhost:33000:demodb::********:?logFile=driver_1.log&logSlowQueries=true&slowQueryThresholdMillis=5]. **CCI ì‘ìš© 프로그램 로그** :: Syntax: syntax error, unexpected IdName [CAS INFO - 127.0.0.1:33000, 1, 30560]. 슬로우 쿼리 ----------- 슬로우 쿼리 ë°œìƒ ì‹œ, ì‘ìš© 프로그램 로그와 CASì˜ SQL 로그를 통해 슬로우 ì¿¼ë¦¬ì˜ ì›ì¸ì„ 파악해야 한다. CUBRID는 ì‘ìš© 프로그램-브로커-DB ì„œë²„ì˜ 3 계층 구조로 ë˜ì–´ 있기 때문ì—, 슬로우 쿼리(slow query) ë°œìƒ ì‹œ ì›ì¸ì´ ì‘ìš© 프로그램-브로커 êµ¬ê°„ì— ìžˆëŠ”ì§€ 브로커-DB 서버 êµ¬ê°„ì— ìžˆëŠ”ì§€ 파악하기 위해 ì‘ìš© 프로그램 로그 ë˜ëŠ” 브로커 ì‘ìš© 서버(CAS)ì˜ SQL 로그를 확ì¸í•´ì•¼ 한다. ì‘ìš© 프로그램 로그ì—는 슬로우 쿼리가 ì¶œë ¥ë˜ì—ˆëŠ”ë° CASì˜ SQL 로그ì—는 해당 질ì˜ê°€ 슬로우 쿼리로 ì¶œë ¥ë˜ì§€ 않았다면, ì‘ìš© 프로그램-브로커 사ì´ì—서 ì†ë„ê°€ ì €í•˜ëœ ì›ì¸ì´ ì¡´ìž¬í• ê²ƒì´ë‹¤. 몇가지 예는 다ìŒê³¼ 같다. * ì‘ìš© 프로그램-브로커 사ì´ì—서 ë„¤íŠ¸ì›Œí¬ í†µì‹ ì†ë„ê°€ ì €í•˜ë˜ì—ˆëŠ”ì§€ 확ì¸í•´ 본다. * 브로커 로그( **$CUBRID/log/broker** ë””ë ‰í„°ë¦¬ ì´í•˜ì— 존재)ì— ê¸°ë¡ë˜ëŠ” ì •ë³´ë¥¼ 통해 CASê°€ ìž¬ì‹œìž‘ëœ ê²½ìš°ê°€ 있는지 확ì¸í•œë‹¤. CAS 개수가 부족한 것으로 파악ë˜ë©´ CAS 개수를 늘리는ë°, ì´ë¥¼ 위해 cubrid_broker.confì˜ :ref:`MAX_NUM_APPL_SERVER <max-num-appl-server>`\ ê°’ì„ ì ì ˆížˆ ëŠ˜ë ¤ì•¼ 한다. ì´ì™€ 함께 cubrid.confì˜ :ref:`max_clients <max_clients>` ê°’ë„ ëŠ˜ë¦¬ëŠ” ê²ƒì„ ê³ ë ¤í•´ì•¼ 한다. ì‘ìš© 프로그램 로그와 CASì˜ SQL ë¡œê·¸ì— ë‘˜ 다 슬로우 쿼리로 ì¶œë ¥ë˜ê³ 둘 사ì´ì— 해당 질ì˜ì˜ 수행 시간 ì°¨ì´ê°€ ê±°ì˜ ì—†ë‹¤ë©´, 브로커-DB 서버 사ì´ì—서 ì†ë„ê°€ ì €í•˜ëœ ì›ì¸ì´ ì¡´ìž¬í• ê²ƒì´ë‹¤. 한 예로, DB 서버ì—서 질ì˜ë¥¼ ì²˜ë¦¬í•˜ëŠ”ë° ì‹œê°„ì´ ê±¸ë ¸ì„ ê²ƒì´ë‹¤. 슬로우 쿼리 ë°œìƒ ì‹œ ê° ì‘ìš© 프로그램 ë¡œê·¸ì˜ ì˜ˆëŠ” 다ìŒê³¼ 같다. **JDBC ì‘ìš© 프로그램 로그** :: 2013-05-09 16:25:08.831|INFO|SLOW QUERY [CAS INFO] localhost:33000, 1, 12916 [TIME] START: 2013-05-09 16:25:08.775, ELAPSED: 52 [SQL] SELECT * from db_class a, db_class b **CCI ì‘ìš© 프로그램 로그** :: 2013-05-10 18:11:23.023 [TID:14346] [DEBUG][CONHANDLE - 0002][CAS INFO - 127.0.0.1:33000, 1, 12916] [SLOW QUERY - ELAPSED : 45] [SQL - select * from db_class a, db_class b] ì‘ìš© 프로그램과 ë¸Œë¡œì»¤ì˜ ìŠ¬ë¡œìš° 쿼리 ì •ë³´ëŠ” ê°ê° 다른 파ì¼ë¡œ 다ìŒê³¼ ê°™ì€ ê²½ìš°ì— ì €ìž¥ëœë‹¤. * ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ ìŠ¬ë¡œìš° 쿼리 ì •ë³´ëŠ” ì—°ê²° URLì˜ **logSlowQueries** ì†ì„±ì„ **yes**\ 로 ì„¤ì •í•˜ê³ **slowQueryThresholdMillis** ê°’ì„ ì„¤ì •í•˜ë©´ logFile ì†ì„±ìœ¼ë¡œ ì§€ì •í•œ ì‘ìš© 프로그램 로그 파ì¼ì— ì €ìž¥ëœë‹¤(:func:`cci_connect_with_url`, :ref:`jdbc-connection-conf` ì°¸ê³ ). * ë¸Œë¡œì»¤ì˜ ìŠ¬ë¡œìš° 쿼리 ì •ë³´ëŠ” :ref:`broker-configuration`\ ì˜ SLOW_LOG ê°’ì„ ON으로 ì„¤ì •í•˜ê³ **LONG_QUERY_TIME** ê°’ì„ ì„¤ì •í•˜ë©´ $CUBRID/log/broker/sql_log ë””ë ‰í„°ë¦¬ì— ì €ìž¥ëœë‹¤. 서버 ì—러 로그 ============== cubrid.confì—서 **error_log_level** ì„ ì„¤ì •í•´ì„œ 서버 오류 로그로부터 다양한 ì •ë³´ë¥¼ ì–»ì„ ìˆ˜ 있다. **error_log_level** ì˜ ê¸°ë³¸ê°’ì€ **NOTIFICATION** ì´ë‹¤. ì´ íŒŒë¼ë¯¸í„°ë¥¼ ì„¤ì •í•˜ëŠ” ë°©ë²•ì€ :ref:`error-parameters` 를 ì°¸ê³ í•œë‹¤. .. 4957 .. 10703 오버플로우 키 ë˜ëŠ” 오버플로우 페ì´ì§€ ê°ì§€ ----------------------------------------- 오버플로우 키나 오버플로우 페ì´ì§€ê°€ ë°œìƒí•˜ë©´ 서버 ì—러 로그 파ì¼ì— **NOTIFICATION** 메시지를 ì¶œë ¥í•œë‹¤. 사용ìžëŠ” ì´ ë©”ì‹œì§€ë¥¼ 통해 오버플로우 키 ë˜ëŠ” 오버플로우 페ì´ì§€ë¡œ ì¸í•´ DB ì„±ëŠ¥ì´ ëŠë ¤ì¡ŒìŒì„ ê°ì§€í• 수 있다. 가능하다면 오버플로우 키나 오버플로우 페ì´ì§€ê°€ ë°œìƒí•˜ì§€ 않ë„ë¡ í•˜ëŠ” ê²ƒì´ ì¢‹ë‹¤. 즉, í¬ê¸°ê°€ í° ì¹¼ëŸ¼ì— ì¸ë±ìŠ¤ë¥¼ 사용하지 않는 ê²ƒì´ ì¢‹ìœ¼ë©°, ë ˆì½”ë“œì˜ í¬ê¸°ë¥¼ 너무 í¬ê²Œ 잡지 않는 ê²ƒì´ ì¢‹ë‹¤. :: Time: 06/14/13 19:23:40.485 - NOTIFICATION *** file ../../src/storage/btree.c, line 10617 CODE = -1125 Tran = 1, CLIENT = testhost:csql(24670), EID = 6 Created the overflow key file. INDEX idx(B+tree: 0|131|540) ON CLASS hoo(CLASS_OID: 0|522|2). key: 'z ..... '(OID: 0|530|1). ........... Time: 06/14/13 19:23:41.614 - NOTIFICATION *** file ../../src/storage/btree.c, line 8785 CODE = -1126 Tran = 1, CLIENT = testhost:csql(24670), EID = 9 Created a new overflow page. INDEX i_foo(B+tree: 0|149|580) ON CLASS foo(CLASS_OID: 0|522|3). key: 1(OID: 0|572|578). ........... Time: 06/14/13 19:23:48.636 - NOTIFICATION *** file ../../src/storage/btree.c, line 5562 CODE = -1127 Tran = 1, CLIENT = testhost:csql(24670), EID = 42 Deleted an empty overflow page. INDEX i_foo(B+tree: 0|149|580) ON CLASS foo(CLASS_OID: 0|522|3). key: 1(OID: 0|572|192). .. 9620 로그 회복 시간 ê°ì§€ ------------------- DB 서버 시작ì´ë‚˜ 백업 볼륨 복구 시 서버 ì—러 로그 ë˜ëŠ” restoredb ì—러 로그 파ì¼ì— 로그 회복(log recovery) 시작 시간과 종료 ì‹œê°„ì— ëŒ€í•œ **NOTIFICATION** 메시지를 ì¶œë ¥í•˜ì—¬, 해당 ìž‘ì—…ì˜ ì†Œìš” ì‹œê°„ì„ í™•ì¸í• 수 있다. 해당 메시지ì—는 ì ìš©(redo)í•´ì•¼í• ë¡œê·¸ì˜ ê°œìˆ˜ì™€ 로그 페ì´ì§€ 개수가 함께 기ë¡ëœë‹¤. :: Time: 06/14/13 21:29:04.059 - NOTIFICATION *** file ../../src/transaction/log_recovery.c, line 748 CODE = -1128 Tran = -1, EID = 1 Log recovery is started. The number of log records to be applied: 96916. Log page: 343 ~ 5104. ..... Time: 06/14/13 21:29:05.170 - NOTIFICATION *** file ../../src/transaction/log_recovery.c, line 843 CODE = -1129 Tran = -1, EID = 4 Log recovery is finished. .. 6128 êµì°© ìƒíƒœ ê°ì§€ -------------- êµì°© ìƒíƒœ ê´€ë ¨ ìž ê¸ˆ ì •ë³´ëŠ” 서버 오류 ë¡œê·¸ì— ê¸°ë¡ëœë‹¤. :: demodb_20160202_1811.err ... Your transaction (index 1, public@testhost|csql(21541)) timed out waiting on X_LOCK lock on instance 0|650|3 of class t because of deadlock. You are waiting for user(s) public@testhost|csql(21529) to finish. ... HA ìƒíƒœ 변경 ê°ì§€ ================= HA ìƒíƒœ ë³€ê²½ì€ cub_master í”„ë¡œì„¸ìŠ¤ì˜ ë¡œê·¸ 파ì¼ì—서 확ì¸í• 수 있다. 로그 파ì¼ì€ **$CUBRID/log** ë””ë ‰í„°ë¦¬ì— *<host_name>.cub_master.err* ì´ë¦„으로 ì €ìž¥ëœë‹¤. HA split-brain ê°ì§€ ------------------- HA 환경ì—서 ë³µì œ êµ¬ì„±ëœ ë‘ ê°œ ì´ìƒì˜ 장비 ëª¨ë‘ ë§ˆìŠ¤í„° ì—í• ì„ ë§¡ê²Œ ë˜ëŠ” ë¹„ì •ìƒì ì¸ ìƒí™©ì´ ë°œìƒí•˜ëŠ” ê²ƒì„ split-brainì´ë¼ê³ 한다. split-brain ìƒíƒœë¥¼ 해소하기 위해 스스로 종료하는 마스터 ë…¸ë“œì˜ cub_master 로그 파ì¼ì€ 다ìŒê³¼ ê°™ì´ ë…¸ë“œ ì •ë³´ë¥¼ í¬í•¨í•œë‹¤. :: Time: 05/31/13 17:38:29.138 - ERROR *** file ../../src/executables/master_heartbeat.c, line 714 ERROR CODE = -988 Tran = -1, EID = 19 Node event: More than one master detected and local processes and cub_master will be terminated. Time: 05/31/13 17:38:32.337 - ERROR *** file ../../src/executables/master_heartbeat.c, line 4493 ERROR CODE = -988 Tran = -1, EID = 20 Node event:HA Node Information ================================================================================ * group_id : hagrp host_name : testhost02 state : unknown -------------------------------------------------------------------------------- name priority state score missed heartbeat -------------------------------------------------------------------------------- testhost03 3 slave 3 0 testhost02 2 master 2 0 testhost01 1 master -32767 0 ================================================================================ ìœ„ì˜ ì˜ˆëŠ” testhost02 서버가 split-brainì„ ê°ì§€í•˜ê³ 스스로 종료ë 때 cub_master ë¡œê·¸ì— ì¶œë ¥í•˜ëŠ” ì •ë³´ì´ë‹¤. Fail-over, Fail-back ê°ì§€ ------------------------- Fail-over í˜¹ì€ Fail-backì´ ë°œìƒí•˜ë©´ 노드는 ì—í• ì„ ë³€ê²½í•˜ê²Œ ëœë‹¤. Fail-over 후 마스터로 변경ë˜ëŠ” 노드 í˜¹ì€ Fail-back 후 ìŠ¬ë ˆì´ë¸Œë¡œ 변경ë˜ëŠ” ë…¸ë“œì˜ cub_master 로그 파ì¼ì€ 다ìŒê³¼ ê°™ì´ ë…¸ë“œ ì •ë³´ë¥¼ í¬í•¨í•œë‹¤. :: Time: 06/04/13 15:23:28.056 - ERROR *** file ../../src/executables/master_heartbeat.c, line 957 ERROR CODE = -988 Tran = -1, EID = 25 Node event: Failover completed. Time: 06/04/13 15:23:28.056 - ERROR *** file ../../src/executables/master_heartbeat.c, line 4484 ERROR CODE = -988 Tran = -1, EID = 26 Node event: HA Node Information ================================================================================ * group_id : hagrp host_name : testhost02 state : master -------------------------------------------------------------------------------- name priority state score missed heartbeat -------------------------------------------------------------------------------- testhost03 3 slave 3 0 testhost02 2 to-be-master -4094 0 testhost01 1 unknown 32767 0 ================================================================================ ìœ„ì˜ ì˜ˆëŠ” Fail-over로 ì¸í•´ testhost02 서버가 ìŠ¬ë ˆì´ë¸Œì—서 마스터로 ì—í• ì„ ë³€ê²½í•˜ëŠ” ë„중 cub_master ë¡œê·¸ì— ì¶œë ¥í•˜ëŠ” ì •ë³´ì´ë‹¤. HA êµ¬ë™ ì‹¤íŒ¨ ============ 사용ìžì˜ 개입 ì—†ì´ ë³µì œë˜ëŠ” DB ë³¼ë¥¨ì˜ ë³µêµ¬ê°€ 불가능한 ê²½ìš°ì˜ ì˜ˆëŠ” 다ìŒê³¼ 같다. * copylogdbì—서 ë³µì‚¬í•˜ë ¤ëŠ” 로그가 ì›ë³¸ 노드ì—서 ì‚ì œëœ ê²½ìš° * active 서버ì—서 ë°˜ì˜í•´ì•¼ 하는 ë³´ê´€ 로그(archive log)ê°€ ì´ë¯¸ ì‚ì œëœ ê²½ìš° * ì„œë²„ì˜ ë³µêµ¬ì— ì‹¤íŒ¨í•œ 경우 ì´ì™€ ê°™ì´ ë³µì œ ë³¼ë¥¨ì˜ ìžë™ 복구가 불가능한 경우 **"cubrid heartbeat start"** ëª…ë ¹ ìˆ˜í–‰ì— ì‹¤íŒ¨í•˜ëŠ”ë°, ê°ê°ì˜ ê²½ìš°ì— ë§žê²Œ 조치한다. 대표ì ì¸ ë³µêµ¬ 불가능 ìž¥ì• ------------------------- 사용ìžì˜ 개입 ì—†ì´ ìžë™ìœ¼ë¡œ ë³µì œë˜ëŠ” DB ë³¼ë¥¨ì˜ ë³µêµ¬ê°€ 불가능한 경우 중 서버 프로세스가 ì›ì¸ì¸ 경우는 워낙 다양하므로 ì„¤ëª…ì„ ìƒëžµí•œë‹¤ **copylogdb** ë˜ëŠ” **applylogdb** 프로세스가 ì›ì¸ì¸ 경우 ì—러 메시지는 다ìŒê³¼ 같다. * **copylogdb** ê°€ ì›ì¸ì¸ 경우 +------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | ì›ì¸ | ì—러 메시지 | +============================================================+==================================================================================================+ | ì•„ì§ ë³µì‚¬ë˜ì§€ ì•Šì€ ë¡œê·¸ê°€ ëŒ€ìƒ ë…¸ë“œì—서 ì´ë¯¸ ì‚ì œë¨ | log writer: failed to get log page(s) starting from page id 80. | +------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | ì´ì „ 복사ë˜ë˜ DB와 다른 DBì˜ ë¡œê·¸ë¡œ íŒë‹¨ë¨ | Log \"/home1/cubrid/DB/tdb01_cdbs037.cub/tdb01_lgat\" does not belong to the given database. | +------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ * **applylogdb** ê°€ ì›ì¸ì¸ 경우 +------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | ì›ì¸ | ì—러 메시지 | +============================================================+==================================================================================================+ | ë³µì œ ë°˜ì˜í• 로그가 í¬í•¨ëœ archive 로그가 ì´ë¯¸ ì‚ì œë¨ | Internal error: unable to find log page 81 in log archives. | | | | | | Internal error: logical log page 81 may be corrupted. | +------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | db_ha_apply_info 카탈로그와 현재 ë³µì œ ë¡œê·¸ì˜ DB ìƒì„± | HA generic: Failed to initialize db_ha_apply_info. | | ì‹œê°„ì´ ë‹¤ë¦„. 즉, ì´ì „ ë°˜ì˜í•˜ë˜ ë³µì œ 로그가 아님 | | | | | +------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | ë°ì´í„°ë² ì´ìФ ë¡œìº˜ì´ ë‹¤ë¦„ | Locale initialization: Active log file(/home1/cubrid/DB/tdb01_cdbs037.cub/tdb01_lgat) charset | | | is not valid (iso88591), expecting utf8. | +------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ HA êµ¬ë™ ì‹¤íŒ¨ 시 대처 방법 ------------------------- ================================================ =============================================================== ìƒí™© 대처 방법 ================================================ =============================================================== 실패 ì›ì¸ì´ ëœ ì›ë³¸ 노드가 마스터 ìƒíƒœì¸ 경우 ë³µì œ 재구성 실패 ì›ì¸ì´ ëœ ì›ë³¸ 노드가 ìŠ¬ë ˆì´ë¸Œ ìƒíƒœì¸ 경우 ë³µì œ 로그 ë° db_ha_apply_info 카탈로그 초기화 후 재시작 ================================================ ===============================================================