✅ Jmeter 다운로드 사이트 

https://jmeter.apache.org/download_jmeter.cgi

JMeter 다운로드 사이트

 

✅ Jmeter 5.5 다운로드 

https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.5.zip

다운받은 Jmeter 압축파일을 원하는 폴더에 압축 해제

JMeter 압축 해제

 

 


 

Open JDK 다운로드

https://jdk.java.net/19/

오라클의 Open JDK 다운로드 사이트

https://download.java.net/java/GA/jdk19.0.2/fdb695a9d9064ad6b064dc6df578380c/7/GPL/openjdk-19.0.2_windows-x64_bin.zip

압축 해제

OR  - 위 아래 둘중의 하나를 다운받으시면 됩니다. Amazon 의 경우에는 설치파일도 있기때문에 좀더 편하게 설치하실 수 도 있습니다.

 

Amazon OpenJDK 다운로드 

https://docs.aws.amazon.com/corretto/latest/corretto-19-ug/downloads-list.html

아마존의 Open JDK 다운로드 사이트

https://corretto.aws/downloads/latest/amazon-corretto-19-x64-windows-jdk.zip

압축 해제

 


 

✅ 시스템 변수 설정

  • JAVA_HOME 시스템 변수를 등록합니다. 변수값으로는 Open JDK 폴더를 입력합니다.
  • Path 시스템 변수에 %JAVA_HOMT%\bin 경로를 추가합니다.

시스템 환경변수 설정

 

Java 버전 확인 및 설치 확인

  • CMD 창에서 java -version 명령을 실행합니다.

JDK 버전 확인

 

JMeter 실행

  • JMeter 설치 폴더(d:\Util\apache-jmeter\apache-jmeter-5.5\bin\) 에서 jmeter.bat 를 실행하여 JMeter 프로그램이 정상 실행되는지 확인 합니다.

JMeter 실행 화면

표시하려는 데이터의 구성에 맞는 그래프 선택법 입니다. 

MySQL / Mariadb 간 버전별 information_schema DB의 테이블 정보 비교 표 입니다.

MariaDB 10.1.48 MySQL 8.0.30 MySQL 5.7.37 Description
  ADMINISTRABLE_ROLE_AUTHORIZATIONS    
ALL_PLUGINS     플러그인 설치여부 및 버전 정보
APPLICABLE_ROLES APPLICABLE_ROLES    
CHANGED_PAGE_BITMAPS      
CHARACTER_SETS CHARACTER_SETS CHARACTER_SETS 지원하는 캐릭터셋 목록
  CHECK_CONSTRAINTS    
CLIENT_STATISTICS      
COLLATIONS COLLATIONS COLLATIONS 지원하는 Collations 목록
COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_CHARACTER_SET_APPLICABILITY 캐릭터셋 과 Collation 맵핑
COLUMN_PRIVILEGES COLUMN_PRIVILEGES COLUMN_PRIVILEGES  
  COLUMN_STATISTICS    
COLUMNS COLUMNS COLUMNS DB별 컬럼 목록(정보)
  COLUMNS_EXTENSIONS    
ENABLED_ROLES ENABLED_ROLES    
ENGINES ENGINES ENGINES  
EVENTS EVENTS EVENTS  
FILES FILES FILES  
GEOMETRY_COLUMNS      
GLOBAL_STATUS   GLOBAL_STATUS  
GLOBAL_VARIABLES   GLOBAL_VARIABLES  
INDEX_STATISTICS      
INNODB_BUFFER_PAGE INNODB_BUFFER_PAGE INNODB_BUFFER_PAGE  
INNODB_BUFFER_PAGE_LRU INNODB_BUFFER_PAGE_LRU INNODB_BUFFER_PAGE_LRU  
INNODB_BUFFER_POOL_STATS INNODB_BUFFER_POOL_STATS INNODB_BUFFER_POOL_STATS  
INNODB_CHANGED_PAGES      
  INNODB_CACHED_INDEXES    
INNODB_CMP INNODB_CMP INNODB_CMP  
INNODB_CMPMEM   INNODB_CMPMEM  
INNODB_CMPMEM_RESET   INNODB_CMPMEM_RESET  
INNODB_CMP_PER_INDEX INNODB_CMP_PER_INDEX INNODB_CMP_PER_INDEX  
INNODB_CMP_PER_INDEX_RESET INNODB_CMP_PER_INDEX_RESET INNODB_CMP_PER_INDEX_RESET  
INNODB_CMP_RESET INNODB_CMP_RESET INNODB_CMP_RESET  
  INNODB_CMPMEM    
  INNODB_CMPMEM_RESET    
  INNODB_COLUMNS    
  INNODB_DATAFILES    
  INNODB_FIELDS    
  INNODB_FOREIGN    
  INNODB_FOREIGN_COLS    
INNODB_FT_BEING_DELETED INNODB_FT_BEING_DELETED INNODB_FT_BEING_DELETED  
INNODB_FT_CONFIG INNODB_FT_CONFIG INNODB_FT_CONFIG  
INNODB_FT_DEFAULT_STOPWORD INNODB_FT_DEFAULT_STOPWORD INNODB_FT_DEFAULT_STOPWORD  
INNODB_FT_DELETED INNODB_FT_DELETED INNODB_FT_DELETED  
INNODB_FT_INDEX_CACHE INNODB_FT_INDEX_CACHE INNODB_FT_INDEX_CACHE  
INNODB_FT_INDEX_TABLE INNODB_FT_INDEX_TABLE INNODB_FT_INDEX_TABLE  
  INNODB_INDEXES    
INNODB_LOCKS   INNODB_LOCKS  
INNODB_LOCK_WAITS   INNODB_LOCK_WAITS  
INNODB_METRICS INNODB_METRICS INNODB_METRICS  
  INNODB_SESSION_TEMP_TABLESPACES    
  INNODB_TABLES    
  INNODB_TABLESPACES    
  INNODB_TABLESPACES_BRIEF    
  INNODB_TABLESTATS    
INNODB_MUTEXES      
INNODB_SYS_COLUMNS   INNODB_SYS_COLUMNS  
INNODB_SYS_DATAFILES   INNODB_SYS_DATAFILES  
INNODB_SYS_FIELDS   INNODB_SYS_FIELDS  
INNODB_SYS_FOREIGN   INNODB_SYS_FOREIGN  
INNODB_SYS_FOREIGN_COLS   INNODB_SYS_FOREIGN_COLS  
INNODB_SYS_INDEXES   INNODB_SYS_INDEXES  
INNODB_SYS_SEMAPHORE_WAITS      
INNODB_SYS_TABLES   INNODB_SYS_TABLES  
INNODB_SYS_TABLESPACES   INNODB_SYS_TABLESPACES  
INNODB_SYS_TABLESTATS   INNODB_SYS_TABLESTATS  
INNODB_TABLESPACES_ENCRYPTION      
INNODB_TABLESPACES_SCRUBBING      
    INNODB_SYS_VIRTUAL  
  INNODB_TEMP_TABLE_INFO INNODB_TEMP_TABLE_INFO  
INNODB_TRX INNODB_TRX INNODB_TRX  
KEY_CACHES      
  INNODB_VIRTUAL    
KEY_COLUMN_USAGE KEY_COLUMN_USAGE KEY_COLUMN_USAGE  
  KEYWORDS    
  OPTIMIZER_TRACE OPTIMIZER_TRACE  
PARAMETERS PARAMETERS PARAMETERS  
PARTITIONS PARTITIONS PARTITIONS  
PLUGINS PLUGINS PLUGINS  
PROCESSLIST PROCESSLIST PROCESSLIST  
PROFILING PROFILING PROFILING  
REFERENTIAL_CONSTRAINTS REFERENTIAL_CONSTRAINTS REFERENTIAL_CONSTRAINTS  
  RESOURCE_GROUPS    
  ROLE_COLUMN_GRANTS    
  ROLE_ROUTINE_GRANTS    
  ROLE_TABLE_GRANTS    
ROUTINES ROUTINES ROUTINES  
SCHEMATA SCHEMATA SCHEMATA  
SCHEMA_PRIVILEGES SCHEMA_PRIVILEGES SCHEMA_PRIVILEGES  
SESSION_STATUS   SESSION_STATUS  
SESSION_VARIABLES   SESSION_VARIABLES  
SPATIAL_REF_SYS      
  SCHEMATA_EXTENSIONS    
  ST_GEOMETRY_COLUMNS    
  ST_SPATIAL_REFERENCE_SYSTEMS    
  ST_UNITS_OF_MEASURE    
STATISTICS STATISTICS STATISTICS  
SYSTEM_VARIABLES      
TABLES TABLES TABLES  
  TABLES_EXTENSIONS    
TABLESPACES TABLESPACES TABLESPACES  
TABLE_CONSTRAINTS TABLE_CONSTRAINTS TABLE_CONSTRAINTS  
  TABLE_CONSTRAINTS_EXTENSIONS    
TABLE_PRIVILEGES TABLE_PRIVILEGES TABLE_PRIVILEGES  
  TABLESPACES_EXTENSIONS    
TABLE_STATISTICS      
TRIGGERS TRIGGERS TRIGGERS  
  USER_ATTRIBUTES    
USER_PRIVILEGES USER_PRIVILEGES USER_PRIVILEGES  
USER_STATISTICS      
  VIEW_ROUTINE_USAGE    
  VIEW_TABLE_USAGE    
VIEWS VIEWS VIEWS  
XTRADB_INTERNAL_HASH_TABLES      
XTRADB_READ_VIEW      
XTRADB_RSEG      

MySQL에서 performance_schema 를 활성화 한 이후 설정 가능한 환경변수 목록 입니다.

변경할 필요가 많지 않습니다.

Variable_name Value Variable_name Value Variable_name Value Description
performance_schema ON performance_schema ON performance_schema ON 성능 모니터링 사용 여부
performance_schema_accounts_size 100 performance_schema_accounts_size -1 performance_schema_accounts_size -1 performance_schema.accounts 테이블 의 최대 행 수
performance_schema_digests_size 5000 performance_schema_digests_size 10000 performance_schema_digests_size 10000 events_statements_summary_by_digest 테이블에 저장할 수 있는 최대 행 수입니다
    performance_schema_error_size 5153      
performance_schema_events_stages_history_long_size 1000 performance_schema_events_stages_history_long_size 10000 performance_schema_events_stages_history_long_size 10000 events_stages_history_long 테이블 의 행 수입니다 .
performance_schema_events_stages_history_size 10 performance_schema_events_stages_history_size 10 performance_schema_events_stages_history_size 10 events_stages_history 테이블의 스레드당 행 수입니다 .
performance_schema_events_statements_history_long_size 1000 performance_schema_events_statements_history_long_size 10000 performance_schema_events_statements_history_long_size 10000 events_statements_history_long 테이블 의 행 수입니다 .
performance_schema_events_statements_history_size 10 performance_schema_events_statements_history_size 10 performance_schema_events_statements_history_size 10 events_statements_history 테이블의 스레드당 행 수입니다 .
    performance_schema_events_transactions_history_long_size 10000 performance_schema_events_transactions_history_long_size 10000 events_transactions_history_long 테이블 의 행 수입니다
    performance_schema_events_transactions_history_size 10 performance_schema_events_transactions_history_size 10 events_transactions_history 의 스레드당 행 수입니다 .
performance_schema_events_waits_history_long_size 1000 performance_schema_events_waits_history_long_size 10000 performance_schema_events_waits_history_long_size 10000 events_waits_history_long 테이블에 포함된 행 수입니다 .
performance_schema_events_waits_history_size 10 performance_schema_events_waits_history_size 10 performance_schema_events_waits_history_size 10 events_waits_history 테이블에 포함된 스레드당 행 수입니다 .
performance_schema_hosts_size 100 performance_schema_hosts_size -1 performance_schema_hosts_size -1 호스트 테이블에 저장된 행 수입니다 . 0으로 설정하면 호스트 테이블에 대한 연결 통계가 유지되지 않습니다.
performance_schema_max_cond_classes 80 performance_schema_max_cond_classes 150 performance_schema_max_cond_classes 80 최대 조건 계측기 수를 지정합니다.
performance_schema_max_cond_instances 1360 performance_schema_max_cond_instances -1 performance_schema_max_cond_instances -1 계측된 조건 개체의 최대 수를 지정합니다.
performance_schema_max_digest_length 1024 performance_schema_max_digest_length 1024 performance_schema_max_digest_length 1024 performance_schema 테이블에 저장 될 때 요약 텍스트에 고려되는 최대 길이입니다.
    performance_schema_max_digest_sample_age 60      
performance_schema_max_file_classes 50 performance_schema_max_file_classes 80 performance_schema_max_file_classes 80 최대 파일 악기 수를 지정합니다.
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768 열린 최대 파일 개체 수를 지정합니다. 항상 open_files_limit 보다 높아야 합니다.
performance_schema_max_file_instances 2500 performance_schema_max_file_instances -1 performance_schema_max_file_instances -1 계측된 파일 개체의 최대 수를 지정합니다.
    performance_schema_max_index_stat -1 performance_schema_max_index_stat -1 계측된 테이블에 대한 최대 인덱스 통계 수입니다.
    performance_schema_max_memory_classes 450 performance_schema_max_memory_classes 320 메모리 풀 기기의 최대 수입니다.
    performance_schema_max_metadata_locks -1 performance_schema_max_metadata_locks -1 성능 스키마 메타데이터 잠금 의 최대 수입니다.
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 350 performance_schema_max_mutex_classes 210 최대 뮤텍스 기기 수를 지정합니다.
performance_schema_max_mutex_instances 5648 performance_schema_max_mutex_instances -1 performance_schema_max_mutex_instances -1 계측된 뮤텍스 인스턴스의 최대 수를 지정합니다.
    performance_schema_max_prepared_statements_instances -1 performance_schema_max_prepared_statements_instances -1 계측된 준비 명령문의 최대 수입니다.
    performance_schema_max_program_instances -1 performance_schema_max_program_instances -1 계측된 프로그램의 최대 수입니다.
performance_schema_max_rwlock_classes 40 performance_schema_max_rwlock_classes 60 performance_schema_max_rwlock_classes 50 최대 rwlock 기기 수를 지정합니다.
performance_schema_max_rwlock_instances 3073 performance_schema_max_rwlock_instances -1 performance_schema_max_rwlock_instances -1 계측된 rwlock 개체의 최대 수를 지정합니다.
performance_schema_max_socket_classes 10 performance_schema_max_socket_classes 10 performance_schema_max_socket_classes 10 최대 소켓 계측기 수를 지정합니다.
performance_schema_max_socket_instances 230 performance_schema_max_socket_instances -1 performance_schema_max_socket_instances -1 계측된 소켓 개체의 최대 수를 지정합니다.
    performance_schema_max_sql_text_length 1024 performance_schema_max_sql_text_length 1024 표시되는 SQL 텍스트의 최대 길이입니다.
performance_schema_max_stage_classes 150 performance_schema_max_stage_classes 175 performance_schema_max_stage_classes 150 최대 스테이지 악기 수를 지정합니다.
performance_schema_max_statement_classes 178 performance_schema_max_statement_classes 219 performance_schema_max_statement_classes 193 최대 명령문 도구 수를 지정합니다. 사용 가능한 명령문 수에 따라 서버 빌드시 자동으로 계산됩니다. 양수 값으로 변경해도 아무런 이점이 없으며 불필요한 메모리가 할당 될 가능성이 높으므로 자동 크기 조정 또는 비활성화 상태로 두어야합니다. 0으로 설정하면 모든 명령문 인스 트루먼 테이션이 사용 불가능하며이 목적으로 메모리가 할당되지 않습니다.
    performance_schema_max_statement_stack 10 performance_schema_max_statement_stack 10 EVENTS_STATEMENTS_CURRENT의 스레드당 행 수입니다.
performance_schema_max_table_handles 2858 performance_schema_max_table_handles -1 performance_schema_max_table_handles -1 열린 테이블 개체의 최대 수를 지정합니다.
performance_schema_max_table_instances 667 performance_schema_max_table_instances -1 performance_schema_max_table_instances -1 계측된 테이블 개체의 최대 수를 지정합니다.
    performance_schema_max_table_lock_stat -1 performance_schema_max_table_lock_stat -1 계측된 테이블에 대한 최대 잠금 통계 수입니다.
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 100 performance_schema_max_thread_classes 50 최대 스레드 악기 수를 지정합니다.
performance_schema_max_thread_instances 288 performance_schema_max_thread_instances -1 performance_schema_max_thread_instances -1 실행 중인 서버 스레드( max_connections 및 max_delayed_threads 참조 )를 계측할 수 있는 수를 지정합니다. max_connections 및 max_delayed_threads의 합보다 커야 합니다.
performance_schema_session_connect_attrs_size 512 performance_schema_session_connect_attrs_size 512 performance_schema_session_connect_attrs_size 512 연결 속성 문자열을 보유하기 위해 스레드별로 사전 할당된 메모리입니다. 문자열이 예약된 공간보다 큰 경우 증가합니다.
performance_schema_setup_actors_size 100 performance_schema_setup_actors_size -1 performance_schema_setup_actors_size -1 성능 스키마 setup_actors 테이블 에 저장할 최대 행 수입니다 .
performance_schema_setup_objects_size 100 performance_schema_setup_objects_size -1 performance_schema_setup_objects_size -1 성능 스키마 setup_objects 테이블에 저장할 수 있는 최대 행 수입니다.
    performance_schema_show_processlist OFF      
performance_schema_users_size 100 performance_schema_users_size -1 performance_schema_users_size -1 performance_schema.users 테이블 의 행 수입니다 . 0으로 설정하면 성능 스키마 가 사용자 테이블에 연결 통계를 저장하지 않습니다.

MySQL 종류 버전별 performance_schema 의 테이블 목록 비교 및 설명 입니다.

중요하다고 생각되는 것들은 붉은글자로 강조표시 하였습니다.

MariaDB 10.1.48 MySQL 8.0.30 MySQL 5.7.37 Description
accounts accounts accounts 클라이언트 계정별 연결 통계
  binary_log_transaction_compression_stats   바이너리 로그 트랜잭션 압축
cond_instances cond_instances cond_instances 동기화 개체 인스턴스
  data_lock_waits   데이터 잠금 대기 관계
  data_locks   보유 및 요청된 데이터 잠금
  error_log   서버 오류 로그 최근 항목
  events_errors_summary_by_account_by_error   계정당 오류 및 오류 코드
  events_errors_summary_by_host_by_error   호스트당 오류 및 오류 코드
  events_errors_summary_by_thread_by_error   스레드당 오류 및 오류 코드
  events_errors_summary_by_user_by_error   사용자당 오류 및 오류 코드
  events_errors_summary_global_by_error   오류 코드당 오류
events_stages_current events_stages_current events_stages_current 현재 스테이지 이벤트
events_stages_history events_stages_history events_stages_history 스레드당 가장 최근의 스테이지 이벤트
events_stages_history_long events_stages_history_long events_stages_history_long 가장 최근의 스테이지 이벤트 전체
events_stages_summary_by_account_by_event_name events_stages_summary_by_account_by_event_name events_stages_summary_by_account_by_event_name 계정별 스테이지 이벤트 및 이벤트명
events_stages_summary_by_host_by_event_name events_stages_summary_by_host_by_event_name events_stages_summary_by_host_by_event_name 호스트 이름 및 이벤트 이름별 스테이지 이벤트
events_stages_summary_by_thread_by_event_name events_stages_summary_by_thread_by_event_name events_stages_summary_by_thread_by_event_name 스레드 및 이벤트 이름당 스테이지 대기
events_stages_summary_by_user_by_event_name events_stages_summary_by_user_by_event_name events_stages_summary_by_user_by_event_name 사용자 이름 및 이벤트 이름별 스테이지 이벤트
events_stages_summary_global_by_event_name events_stages_summary_global_by_event_name events_stages_summary_global_by_event_name 이벤트 이름당 단계 대기
events_statements_current events_statements_current events_statements_current 현재 이벤트
  events_statements_histogram_by_digest   스키마 및 다이제스트 값별 명령문 히스토그램
  events_statements_histogram_global   전역적으로 요약된 명령문 히스토그램
events_statements_history events_statements_history events_statements_history 스레드당 가장 최근의 명령문 이벤트
events_statements_history_long events_statements_history_long events_statements_history_long 가장 최근의 명세서 이벤트 전체
events_statements_summary_by_account_by_event_name events_statements_summary_by_account_by_event_name events_statements_summary_by_account_by_event_name 계정별 명세서 이벤트 및 이벤트명
events_statements_summary_by_digest events_statements_summary_by_digest events_statements_summary_by_digest 스키마별 명령문 이벤트 및 다이제스트 값
events_statements_summary_by_host_by_event_name events_statements_summary_by_host_by_event_name events_statements_summary_by_host_by_event_name 호스트 이름 및 이벤트 이름별 명령문 이벤트
  events_statements_summary_by_program events_statements_summary_by_program 저장 프로그램(함수/SP)당 명령문 이벤트
events_statements_summary_by_thread_by_event_name events_statements_summary_by_thread_by_event_name events_statements_summary_by_thread_by_event_name 스레드별 명령문 이벤트 및 이벤트 이름
events_statements_summary_by_user_by_event_name events_statements_summary_by_user_by_event_name events_statements_summary_by_user_by_event_name 사용자 이름 및 이벤트 이름별 명령문 이벤트
events_statements_summary_global_by_event_name events_statements_summary_global_by_event_name events_statements_summary_global_by_event_name 이벤트 이름당 명령문 이벤트
  events_transactions_current events_transactions_current 현재 거래 이벤트
  events_transactions_history events_transactions_history 스레드당 가장 최근의 트랜잭션 이벤트
  events_transactions_history_long events_transactions_history_long 가장 최근의 거래 이벤트 전체
  events_transactions_summary_by_account_by_event_name events_transactions_summary_by_account_by_event_name 계정별 거래 이벤트 및 이벤트 이름
  events_transactions_summary_by_host_by_event_name events_transactions_summary_by_host_by_event_name 호스트 이름 및 이벤트 이름별 트랜잭션 이벤트
  events_transactions_summary_by_thread_by_event_name events_transactions_summary_by_thread_by_event_name 스레드별 트랜잭션 이벤트 및 이벤트 이름
  events_transactions_summary_by_user_by_event_name events_transactions_summary_by_user_by_event_name 사용자 이름 및 이벤트 이름별 트랜잭션 이벤트
  events_transactions_summary_global_by_event_name events_transactions_summary_global_by_event_name 이벤트 이름별 트랜잭션 이벤트
events_waits_current events_waits_current events_waits_current 현재 대기 이벤트
events_waits_history events_waits_history events_waits_history 스레드당 가장 최근의 대기 이벤트
events_waits_history_long events_waits_history_long events_waits_history_long 가장 최근의 대기 이벤트 전체
events_waits_summary_by_account_by_event_name events_waits_summary_by_account_by_event_name events_waits_summary_by_account_by_event_name 계정 및 이벤트 이름별 대기 이벤트
events_waits_summary_by_host_by_event_name events_waits_summary_by_host_by_event_name events_waits_summary_by_host_by_event_name 호스트 이름 및 이벤트 이름별 대기 이벤트
events_waits_summary_by_instance events_waits_summary_by_instance events_waits_summary_by_instance 인스턴스당 대기 이벤트
events_waits_summary_by_thread_by_event_name events_waits_summary_by_thread_by_event_name events_waits_summary_by_thread_by_event_name 스레드 및 이벤트 이름별 대기 이벤트
events_waits_summary_by_user_by_event_name events_waits_summary_by_user_by_event_name events_waits_summary_by_user_by_event_name 사용자 이름 및 이벤트 이름별 대기 이벤트
events_waits_summary_global_by_event_name events_waits_summary_global_by_event_name events_waits_summary_global_by_event_name 이벤트 이름별 대기 이벤트
file_instances file_instances file_instances 파일 인스턴스
file_summary_by_event_name file_summary_by_event_name file_summary_by_event_name 이벤트 이름당 파일 이벤트
file_summary_by_instance file_summary_by_instance file_summary_by_instance 파일 인스턴스당 파일 이벤트
  global_status global_status 전역 상태 변수
  global_variables global_variables 전역 시스템 변수
host_cache host_cache host_cache 내부 호스트 캐시의 정보
hosts hosts hosts 클라이언트 호스트 이름당 연결 통계
  innodb_redo_log_files    
  keyring_component_status   설치된 키링 구성 요소에 대한 상태 정보
  keyring_keys   키링 키에 대한 메타데이터
  log_status   백업용 서버 로그에 대한 정보
  memory_summary_by_account_by_event_name memory_summary_by_account_by_event_name 계정 및 이벤트 이름별 메모리 작업
  memory_summary_by_host_by_event_name memory_summary_by_host_by_event_name 호스트 및 이벤트 이름별 메모리 작업
  memory_summary_by_thread_by_event_name memory_summary_by_thread_by_event_name 스레드 및 이벤트 이름당 메모리 작업
  memory_summary_by_user_by_event_name memory_summary_by_user_by_event_name 사용자 및 이벤트 이름별 메모리 작업
  memory_summary_global_by_event_name memory_summary_global_by_event_name 이벤트 이름당 전역 메모리 작업
  metadata_locks metadata_locks 메타데이터 잠금 및 잠금 요청
mutex_instances mutex_instances mutex_instances 뮤텍스 동기화 개체 인스턴스
objects_summary_global_by_type objects_summary_global_by_type objects_summary_global_by_type 개체 요약
performance_timers performance_timers performance_timers 사용 가능한 이벤트 타이머
  persisted_variables   mysqld-auto.cnf 파일 내용
  prepared_statements_instances prepared_statements_instances 준비된 명령문 인스턴스 및 통계
  processlist   프로세스 목록 정보(show processlist 와 동일)
  replication_applier_configuration replication_applier_configuration 복제본의 복제 적용자에 대한 구성 매개변수
  replication_applier_filters   현재 복제본에 대한 채널별 복제 필터
  replication_applier_global_filters   현재 복제본의 전역 복제 필터
  replication_applier_status replication_applier_status 복제본의 복제 적용자의 현재 상태
  replication_applier_status_by_coordinator replication_applier_status_by_coordinator SQL 또는 조정자 스레드 적용자 상태
  replication_applier_status_by_worker replication_applier_status_by_worker 작업자 스레드 적용자 상태
  replication_asynchronous_connection_failover   비동기 연결 장애 조치 메커니즘에 대한 소스 목록
  replication_asynchronous_connection_failover_managed   비동기식 연결 장애 조치 메커니즘을 위한 관리 소스 목록
  replication_connection_configuration replication_connection_configuration 소스 연결을 위한 구성 매개변수
  replication_connection_status replication_connection_status 현재 소스 연결 상태
  replication_group_member_stats replication_group_member_stats 복제 그룹 구성원 통계
  replication_group_members replication_group_members 복제 그룹 구성원 네트워크 및 상태
rwlock_instances rwlock_instances rwlock_instances 동기화 개체 인스턴스 잠금
session_account_connect_attrs session_account_connect_attrs session_account_connect_attrs 현재 세션당 연결 속성
session_connect_attrs session_connect_attrs session_connect_attrs 모든 세션에 대한 연결 속성
  session_status session_status 현재 세션의 상태 변수
  session_variables session_variables 현재 세션의 시스템 변수
setup_actors setup_actors setup_actors 새 포그라운드 스레드에 대한 모니터링을 초기화하는 방법
setup_consumers setup_consumers setup_consumers 이벤트 정보를 저장할 수 있는 소비자
setup_instruments setup_instruments setup_instruments 이벤트를 수집할 수 있는 계측 개체의 클래스
setup_objects setup_objects setup_objects 모니터링해야 하는 개체
  setup_threads   계측된 스레드 이름 및 속성
setup_timers   setup_timers  
socket_instances socket_instances socket_instances 활성 연결 인스턴스
socket_summary_by_event_name socket_summary_by_event_name socket_summary_by_event_name 이벤트 이름당 소켓 대기 및 I/O
socket_summary_by_instance socket_summary_by_instance socket_summary_by_instance 소켓 대기 및 인스턴스당 I/O
  status_by_account status_by_account 계정당 세션 상태 변수
  status_by_host status_by_host 호스트 이름당 세션 상태 변수
  status_by_thread status_by_thread 세션당 세션 상태 변수
  status_by_user status_by_user 사용자 이름별 세션 상태 변수
  table_handles table_handles 테이블 잠금 및 잠금 요청
table_io_waits_summary_by_index_usage table_io_waits_summary_by_index_usage table_io_waits_summary_by_index_usage 인덱스당 테이블 I/O 대기
table_io_waits_summary_by_table table_io_waits_summary_by_table table_io_waits_summary_by_table 테이블당 테이블 I/O 대기
table_lock_waits_summary_by_table table_lock_waits_summary_by_table table_lock_waits_summary_by_table 테이블당 테이블 잠금 대기
threads threads threads 서버 스레드에 대한 정보
  tls_channel_status   각 연결 인터페이스에 대한 TLS 상태
  user_defined_functions   등록된 로드 가능한 함수
  user_variables_by_thread   스레드당 사용자 정의 변수
users users user_variables_by_thread 클라이언트 사용자 이름당 연결 통계
  variables_by_thread users 세션당 세션 시스템 변수
  variables_info variables_by_thread 시스템 변수가 가장 최근에 설정되는 방식

✔️ 모듈 사용

import pandas as pd
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager as fm
from sqlalchemy import create_engine
import urllib.parse

✔️ 추가 설정

np.set_printoptions(precision=3)            # 소수점 3번째 자리에서 반올림
pd.set_option('display.max_rows', None)     # Row 생략없이 출력
pd.set_option('display.max_columns', None)  # Column 생략없이 출력
pd.set_option('display.max_colwidth', None) # 컬럼의 내용이 길어도 생략없이 출력
pd.set_option('display.width', None)
pd.set_option('display.float_format', '{:.5f}'.format) # 8.500000e+01 이런 형식의 지수표현을 하고 싶지 않을 경우

✔️ 엑셀파일 불러오기

# Jupyter Notebook이 실행중인 서버의 파일만 불러올 수 있습니다.
# 절대 경로를 입력합니다.
# Sheet 이름은 대소문자를 구분합니다.

df_user_calc = pd.read_excel(r'D:\6월\유저지표_20220708.xlsx', sheet_name='user_calc');

✔️ 엑셀파일 내보내기

# Jupyter Notebook이 설치된 서버에 파일이 저장됩니다.
# 인덱스 컬럼은 내보내지 않습니다.

UserData.to_excel(r'd:\UserData.xlsx', sheet_name='UserData', index=False)

✔️ 기존 엑셀 파일에 Sheet를 추가하여 내보내기

with pd.ExcelWriter(r'D:\user_data\2022_유저통계.xlsx', engine='openpyxl', mode='a') as writer:
    temp.to_excel(writer, sheet_name='2022_유저통계')

✔️ 모듈 사용

import pandas as pd
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager as fm
from sqlalchemy import create_engine
import urllib.parse

✔️ 추가 설정

np.set_printoptions(precision=3)            # 소수점 3번째 자리에서 반올림
pd.set_option('display.max_rows', None)     # Row 생략없이 출력
pd.set_option('display.max_columns', None)  # Column 생략없이 출력
pd.set_option('display.max_colwidth', None) # 컬럼의 내용이 길어도 생략없이 출력
pd.set_option('display.width', None)
pd.set_option('display.float_format', '{:.5f}'.format) # 8.500000e+01 이런 형식의 지수표현을 하고 싶지 않을 경우

 

✔️ DB 접속 및 쿼리 실행

# DB 접속 객체 생성
sqlEngine = create_engine("mysql+pymysql://root:Qwer1234%21%40%23%24@10.240.71.71:25000", encoding='utf8', pool_recycle=3600)
dbConnection = sqlEngine.connect()   # DB 접속
user_data = pd.read_sql("select * from a209.user_info where user_id = 'a209' ", dbConnection); # 쿼리 실행
dbConnection.close() # 접속 종료

 

Jupyter notebook에 이미지를 추가하는 방법입니다. (Jupyter notebook 버전 6.4.8)

 

1. 코딩으로 이미지 출력

명령창은 Code로 설정하고 아래와 같이 입력 후 실행하면 화면에 이미지가 표시됩니다..

코딩창이 보이기에 이쁘지는 않습니다.

from IPython.display import Image
Image('images/방수어사_라온테크_min.jpg')

 ✔️ 아래는 출력 결과입니다.


2. markdown으로 이미지 출력 - 1

코딩창을 Markdown으로 설정 후 아래와 같이 입력후 실행하시면 코딩영역 없이 이미지를 화면에 출력합니다.

# Markdown으로 설정 후 실행하면 이미지가 출력됩니다.
![nn](images/방수어사_라온테크_min.jpg)

 ✔️ 출력 결과

 

3. markdown으로 이미지 출력 - Img 태그 사용

# Markdown에서 이미지 태그를 사용할 수 있고 스타일도 정의할 수 있습니다.
<img src="Images/방수어사_라온테크_min.jpg" style='margin-left:20px; width:700px; height:200px'>

✔️ 출력 결과

 

⭐ 본 이미지는 동생 창업기념으로 제가 레이저로 나무에 각인한 작품입니다.

Jupyter Notebook QHD 해상도의 모니터에서는 최대 화면으로 실행하게되면 좌우 여백이 너무 넓어서 불편합니다.

아래 경로의 파일에서

C:\ProgramData\Anaconda3\Lib\site-packages\notebook\static\style\style.min.css

아래와 같이 수정 후 페이지를 새로고침 하시면

@media (min-width: 1200px) {
  .container {
    /* width: 1140px; -- 기존 코드는 주석처리 */ 
	width: 98%;  /* 가로폭의 98% 가득 차도록 설정 */
  }
}

코딩 영역이 가로폭에 꽉 차서 표시됩니다.

 

외부 인터넷 접속이 되지 않는 환경에서  모듈을 설치하는 방법 입니다.

자주 사용하는 MySQL 모듈을 기준으로 설명드리겠습니다. 

1. https://pypi.org/ 사이트에 접속하여 다운받을 모듈과 버전 정보를 결정합니다.

    - https://pypi.org/project/PyMySQL/

    - https://pypi.org/project/PyMySQL/#history 버전 정보를 확인합니다.

 

2.  cmd를 실행하여 아래와 같이 모듈 정보를 입력합니다.

pip download -d ./ PyMySQL==1.0.1

    위와 같이 실행시 SSL  오류가 발생하며 다운로드가 안된다면 아래와 같이 실행합니다.

pip --trusted-host pypi.org --trusted-host files.pythonhosted.org download -d ./ PyMySQL

 

    - 버전을 명시하지 않을 경우 최신 버전이 다운로드 됩니다.

 

3. 파일을 폐쇄망으로 이동시킵니다.

 

4. 아래 명령어를 통해서 다운받은 모듈을 설치합니다.

pip install --no-index --find-links=./ PyMySQL          << 특정 위치의 모듈을 설치할 경우

pip install --no-index --find-links=./ PyMySQL==1.0.2   << 특정 버전의 모듈을 설치할 경우

pip install --no-index PyMySQL                          << 모듈이 위치한 폴더에서 실행할 경우

 

5. 설치된 모듈과 버전 정보를 확인합니다.

pip list

파일명 혹은 변수에 '-'가 제거된 날짜값을 사용하게 되는데(20220715)

날짜 형식으로 변환할 때 MySQL 에서는 str_to_date 함수를 사용할 수 있습니다.

%Y 4자리 년도 %T hh:mm:ss
%y 2자리 년도 %r hh:mm:ss AM/PM
%m 2자리 월(01, 02, 10, 11 ...) %M 월 (영문 전체 March, July ...)
%c 월(1, 2, 10, 11 ...) %b 월 (영문 축약 Mar, Jul ...)
%d 2자리 일(01, 01, 10, 11 ...) %W 요일 (영문 전체 Monday, Thursday ...)
%e 일(1, 2, 10, 11 ...) %a 요일 (영문 축약 Mon, Thu ...) 
%H 24시간제 시간    
%l 12시간제 시간    
%i 2자리 분 (05, 15 ...)    
%S 2자리 초 (05, 15 ...)    

사용 방법은 위 포맷을 참고하여 아래와 같이 사용해 주시면 됩니다.

하지만 아래와 같이 31을 넘어가는 날짜가 입력되면 null을 출력하지만 

4월31을 입력할 경우 4월30일 에서 하루 지난 5월1일을 출력하는 오류가 있습니다.

-- MySQL 5.7.37 / MySQL 8.0.23 / MariaDB 10.1.48 모두에서 아래와 같이 출력 됩니다.

select str_to_date(20220230, '%Y%m%d');   -- 2022-03-02 출력 (Error: 22년 2월은 28일 까지만 존재)
select str_to_date(20220430, '%Y%m%d');   -- 2022-04-30 출력
select str_to_date(20220431, '%Y%m%d');   -- 2022-05-01 출력 (Error: 4월은 30일 까지만 존재함)
select str_to_date(20220432, '%Y%m%d');   -- null 출력
select str_to_date(20220531, '%Y%m%d');   -- 2022-05-31 출력
select str_to_date(20220532, '%Y%m%d');   -- null 출력

입력된 날짜의 무결성이 중요하다면 함수를 만들어 사용하는 것이 좋을 것 같습니다.

쿼리창에서 괄호를 열때 자동으로 닫음이 추가되어 불편하신 분들은 아래 옵션을 해제하시면 됩니다.

Editor > General > Smart Keys 메뉴에 들어가셔서.

✳️ 첨부 파일은 Visual Studio 2017 프로젝트 파일입니다.

Python_Windows_Service.7z
0.09MB

Python으로 제작한 프로그램을 Windows Service로 만드는 가장 확실한 방법 입니다. 

준비물 : 

1. nssm : https://nssm.cc/download

 

NSSM - the Non-Sucking Service Manager

NSSM - the Non-Sucking Service Manager Windows 10, Server 2016 and newer 2017-04-26: Users of Windows 10 Creators Update or newer should use prelease build 2.24-101 or any newer build to avoid an issue with services failing to start. If for some reason you

nssm.cc

➔ 테스트 Project 파일과 함께 첨부해 놓았으나 최신 버전이 필요하시면 위 링크에서 다운로드 하시면 됩니다.

 

Service 등록 절차

✔️ Python 예제 프로그램

#_*_ coding: utf-8 _*_
import os
import sys
import time
import logging
from datetime import datetime, timedelta

def init():
    current_directory = os.path.dirname(os.path.realpath(__file__)) # .py 파일 위치
    current_log_directory = os.path.join(current_directory, "Log")  # 생성할 로그 폴더
    try:
        if not os.path.exists(current_log_directory):   # 로그 폴더 존재여부 검사
            os.makedirs(current_log_directory)          # 폴더 생성
    except OSError:
        print('----------------- Error -----------------')
        return -1

    # 로그파일 설정
    now_date_str = datetime.now().strftime('%Y%m%d_%H%M%S') # 현재 시간을 파일명으로 사용
    errorlogfilename = os.path.join(current_log_directory , "Log_%s.log" % (now_date_str))  # 로그파일의 전체 경로

    # 로그파일 생성
    logging.basicConfig(
        filename=errorlogfilename, 
        level=logging.DEBUG, 
        format='[%(asctime)s][%(name)s][%(levelname)s] - %(message)s'
    )
    return 1

def main():

    # 1초마다 로그파일에 현재 시간을 기록
    for i in range(10):
        out_message = "Now Time : %s" % (datetime.now().strftime('%Y-%m-%d_%H:%M:%S'))
        logging.info("Now Time : %s" % (out_message))
        print("Now Time : %s" % (out_message))
        time.sleep(1)

    return

if __name__ == '__main__':
    if (init() >= 1):
        while True:
            main()
            time.sleep(10)  # 10초마다 main() 함수 실행
    else:
        print("Exit")

✔️ 관리자 권한으로 CMD를 실행하여 nssm이 보관된 폴더로 이동합니다.

✔️ nssm install [서비스명]을 입력합니다.

 

✔️ Path : Python 실행파일을 선택합니다. (Startup directory는 자동으로 채워집니다.)

     ex) C:\Users\kirum\AppData\Local\Programs\Python\Python39\python.exe

✔️ Arguments : xxxx.py 파일을 전체 경로를 입력합니다.

     ex) D:\T\Python_Windows_Service\Python_Windows_Service\Python_Windows_Service.py

✔️ Install service 클릭

 

✔️ 정상적으로 Service가 등록되었으며 시작/중지 모두 정상적으로 작동합니다.

Nifi 를 Windows Service로 등록 및 운용하는 방법입니다. 

Python Flask 프로그램의 경우도 동일한 방법으로 Service로 등록할 수 있습니다.

http://nssm.cc/

 

NSSM - the Non-Sucking Service Manager

NSSM - the Non-Sucking Service Manager nssm is a service helper which doesn't suck. srvany and other service helper programs suck because they don't handle failure of the application running as a service. If you use such a program you may see a service lis

nssm.cc

- 저장한 NSSM 압축 파일의 압축을 해제합니다.

 

Nifi 서비스 등록 방법

1. 관리자 권한으로 CMD를 실행

2.  nssm 설치폴더 에서 nssm install [서비스명] 형태로 실행

3. 설정화면이 표시되면 Path의 선택버튼을 눌러 run-nifi.bat 파일을 선택

4. Install service 버튼을 눌러 서비스 등록 완료

5. 서비스 등록 확인

6. 서비스 관리자 에서는 nssm.exe를 실행하는것으로 보이지만 [레지스트리 편집기]를 보시면 nssm에 파라메터를 등록하여 nifi를 실행하고 있는것을 확인할 수 있습니다.

PC 재시작 / 서비스관리자를 통한 서비스 실행/중지 모두 정상적으로 동작하는것을 확인하였습니다.

 

Python Flask 웹 프로그램의 경우도 Python 파일을 실행하도록 xxx.bat 파일을 만들고

nssm으로 해당 xxx.bat 파일을 실행하도록 등록하면 됩니다.

'기타' 카테고리의 다른 글

[배터리] 18650 vs 14500 규격(사이즈)  (0) 2023.03.12
[가죽] 프레스  (0) 2023.03.10
Zotac egpu 와 2018 LG gram 연결 정보  (0) 2021.01.08
마우스 스위치 모음  (0) 2020.02.15
MAC PowerPoint 및 Word 의 탭 간격 조정 방법  (0) 2016.02.26

레드마인의 검색 기능에서 검색된 결과들은 클릭시 동일 탭에서 표시됩니다.

일반 일감의 경우는 크게 상관이 없으나 

보통 검색 작업은 검색 -> 항목 클릭 -> 내용 확인 -> 다른 검색 결과 항목 클릭 -> 내용 확인을

반복하게 되는데 이때 항목을 클릭했을 때 내용이 별도 탭으로 표시되면

재 검색하는 시간이 감소 합니다.

우클릭 / [새 탭에서 링크 열기] 메뉴를 사용해도 되지만 이를 깜박 잊고 클릭하게 되면 검색 페이지를 벗어났기 때문에

뒤로 가기로 검색시 첫 페이지 부터 표시되는 불상사가 발생합니다.

 

아래와 같이 레드마인 소스를 수정 및 적용하게 되면 검색 결과의 모든 링크는 

클릭시 자동으로 별도 탭에 표시 됩니다. 

 

- 레드마인 : 4.2.3 버전을 기준으로 설명 드립니다. (다른 버전도 파일명 위치 등이 비슷하기 때문에 이 글을 참고로 쉽게 수정하실 수 있습니다.)

- 레드마인의 설치 경로는 C:\Bitnami\redmine-4.2.3-3 라고 가정하겠습니다. 

1. C:\Bitnami\redmine-4.2.3-3\apps\redmine\htdocs\app\views\search\index.html.erb  파일을 메모장으로 열어

2.  link_to 함수에 아래와 같이 , :target => "_blank" 키워드를 추가 합니다.

<% if @results %>
    <div id="search-results-counts">
      <%= render_results_by_type(@result_count_by_type) unless @scope.size == 1 %>
    </div>
    <h3><%= l(:label_result_plural) %> (<%= @result_count %>)</h3>
    <dl id="search-results">
      <% @results.each do |e| %>
        <dt class="<%= e.event_type %> icon icon-<%= e.event_type %>">
          <%= content_tag('span', e.project, :class => 'project') unless @project == e.project %>
          <%= link_to(highlight_tokens(e.event_title.truncate(255), @tokens), e.event_url, :target => "_blank") %>
        </dt>
        <dd><span class="description"><%= highlight_tokens(e.event_description, @tokens) %></span>
        <span class="author"><%= format_time(e.event_datetime) %></span></dd>
      <% end %>
    </dl>
<% end %>

3.  redmineThin 서비스 2개를 모두 재시작 합니다.

4. 검색 결과에 target="_blank" 키워드가 추가된것이 보입니다.

 

5. 이제 검색된 결과의 항목을 클릭하게 되면 별도 탭으로 해당 게시물이 열립니다.

Tencent 공식 문서 : https://tendbcluster.net/book-en/

설치 필요 사항

(1) Docker 설치

  1. yum 패키지 업데이트

      $ yum -y update

  2. yum-utils 설치

      $ sudo yum install -y yum-utils

  3. Docker 저장소 등록

      $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  4. Docker 버전 조회

      $ yum list docker-ce --showduplicates | sort -r

  5. 특정 버전의 Docker 설치

      $ sudo yum install docker-ce-20.10.7-3.el7 docker-ce-cli-20.10.7-3.el7 containerd.io

  6. 버전 확인

      $ docker --version

  7. 서비스 시작

      $ systemctl start docker

      $ systemctl enable docker

      $ systemctl status docker

 

(2) Docker-compose 설치

  1. 설치 버전 확인

      https://github.com/docker/compose/tags

      https://github.com/docker/compose/releases/tag/1.27.4

  2. usr/local/bin 폴더에 다운로드

  $ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

  3. 실행 권한 부여

      $ sudo chmod +x /usr/local/bin/docker-compose

  4. 심볼링링크 설정
      $ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

  5. 버전 확인

      $ docker-compose --version

(3) helm 설치

  1. 설치할 버전 확인

      https://github.com/helm/helm/releases?page=3

  2. 다운로드

      $ wget https://get.helm.sh/helm-v2.17.0-linux-amd64.tar.gz

  3. 압축 해제

      $ tar xvzf helm-v2.17.0-linux-amd64.tar.gz

  4. 파일 이동

      $ sudo cp linux-amd64/tiller /usr/local/bin

      $ sudo cp linux-amd64/helm /usr/local/bin

  5. 권한 설정

      $ sudo chown root:docker /usr/local/bin/tiller

      $ sudo chown root:docker /usr/local/bin/helm

  6. 심볼릭 링크 설정
      $ sudo ln -s /usr/local/bin/helm /usr/bin/helm
      $ sudo ln -s /usr/local/bin/tiller /usr/bin/tiller

 

  7. 버전 확인

      $ helm version

      $ tiller --version

 

(4) Tendbcluster 도커 설치

  1. 환경설정파일 다운로드

      $ sudo curl -L "https://github.com/TenDBCluster/TenDBCluster-DockerCompose/archive/refs/heads/master.zip" -o tendbcluster-docker-compose.zip

  2. 압축 해제

      $ unzip tendbcluster-docker-compose.zip

  3. 폴더명 변경

      $ mv TenDBCluster-DockerCompose-master/ tendbcluster-docker-compose/

  4. Docker 이미지 다운로드

      $ cd tendbcluster-docker-compose && docker-compose pull

  5. 이미지 마운트

      $ docker-compose up -d

  6. 상태 조회

      $ docker ps -a

  7. 노란색 영역의 Port 번호로 MySQL 접속 테스트 

 

✳️ Tspider 가 설치된 CentOS 7 이미지 공유(VmWare)

OS : CentOS7OS

접속 정보 : root / Qwer1234!@#$ , tspider / Qwer1234!@#$

Tspider 접속 정보 : tendbcluster / tendbclusterpass

Google Drive : https://drive.google.com/file/d/17AnTdSycpYfAJDCXOF2uz_XwwZQXeDqL/view?usp=sharing

파일 용량 정보 : 

  - 압축 : 2.5 GB

  - 압죽 해제 : 10.9 GB

'Database & Data > Tspider' 카테고리의 다른 글

(1) 텐센트의 TSpider 소개  (2) 2021.01.03

데이터를 모으고 DB화하여 공유하는게 취미 입니다.

이번에는 다음 사이트에서 확인 가능한 대한민국 환율정보를 모아봤습니다.

✳️ MySQL DB에 저장 후 백업 파일로 공유드립니다.

https://finance.daum.net/exchanges/FRX.KRWUSD

 

 

환율 상세 | 다음 금융

 

finance.daum.net

✅ 일자별 환율 정보를 DB에 저장

 

✅ 대상 국가

currencyCode item_count min_date max_date nation_name
AED 3837 2006-01-02 2021-06-18 아랍에미리트
AUD 3837 2006-01-02 2021-06-18 호주
BDT 3837 2006-01-02 2021-06-18 방글라데시
BHD 3837 2006-01-02 2021-06-18 바레인
BND 3837 2006-01-02 2021-06-18 브루나이
BRL 3806 2006-01-02 2021-06-18 브라질
CAD 3817 2006-01-02 2021-06-18 캐나다
CHF 3837 2006-01-02 2021-06-18 스위스
CNY 3827 2006-01-02 2021-06-18 중국
CZK 1884 2013-11-01 2021-06-18 체코
DKK 3820 2006-01-02 2021-06-18 덴마크
EGP 3837 2006-01-02 2021-06-18 이집트
EUR 3837 2006-01-02 2021-06-18 유로
GBP 3836 2006-01-02 2021-06-18 영국
HKD 3837 2006-01-02 2021-06-18 홍콩
HUF 3311 2007-06-01 2021-06-18 헝가리
IDR 3837 2006-01-02 2021-06-18 인도네시아
ILS 3673 2006-01-02 2021-06-18 이스라엘
INR 3817 2006-01-02 2021-06-18 인도
JOD 3653 2006-01-02 2021-06-18 요르단
JPY 3837 2006-01-02 2021-06-18 일본
KWD 3837 2006-01-02 2021-06-18 쿠웨이트
KZT 1884 2013-11-01 2021-06-18 카자흐스탄
MNT 1884 2013-11-01 2021-06-18 몽골
MXN 3837 2006-01-02 2021-06-18 멕시코
MYR 3830 2006-01-02 2021-06-18 말레이시아
NOK 3837 2006-01-02 2021-06-18 노르웨이
NZD 3830 2006-01-02 2021-06-18 뉴질랜드
PHP 3837 2006-01-02 2021-06-18 필리핀
PKR 3827 2006-01-02 2021-06-18 파키스탄
PLN 3321 2007-06-01 2021-06-18 폴란드
QAR 1884 2013-11-01 2021-06-18 카타르
RUB 3462 2006-11-08 2021-06-18 러시아
SAR 3837 2006-01-02 2021-06-18 사우디
SEK 3837 2006-01-02 2021-06-18 스웨덴
SGD 3837 2006-01-02 2021-06-18 싱가포르
THB 3837 2006-01-02 2021-06-18 태국
TRY 1884 2013-11-01 2021-06-18 터키
TWD 3816 2006-01-02 2021-06-18 대만
USD 3837 2006-01-02 2021-06-18 미국
VND 3485 2006-09-29 2021-06-18 베트남
ZAR 3455 2006-11-17 2021-06-18 남아공

✅ 기간 : 2006-01-02 ~ 2021-06-18

✅ MySQL 백업 파일

db_exchange_rate_backup_20210619.7z
2.61MB

DataGrip 을 사용하다 보면 다양한 편의성 및 기능으로 인해 편리한 경우도 있지만, 의외로 불편한 경우도 많습니다. 

sp/함수 인자의 이름이 표시되는 아래 기능이 그런 경우가 아닐까 싶습니다. 

우측 설정시/비 설정시 이미지를 보시고 어떤 기능인지 확인해 보시면 될것 같습니다. 

기본은 활성화 입니다.

Autohotkey 에서 창 크기 조정 단축키 코드 입니다.

가로 세로를 아래 코드를 응용하시면 됩니다. 

본인은 Ctrl + Shift + Left/Right 단축키를 줄선택으로 정의해 놓아서 창 크기 조정은 정의하지 않았습니다.

; 활성창의 높이를 증가
^+Down::
	; 활성창 타이틀 조회
	WinGetActiveTitle, title
	; 활성창 위치,크기 조회
	WinGetPos, x, y, Width, Height, %title%
	; 활성창의 크기 조정
	WinMove, %title%, , x, y, Width, Height + 20
	Return
	
; 활성창의 높이를 축소	
^+Up::
	; 활성창 타이틀 조회
	WinGetActiveTitle, title
	; 활성창 위치,크기 조회
	WinGetPos, x, y, Width, Height, %title%
	; 활성창의 크기 조정
	WinMove, %title%, , x, y, Width, Height - 20
	Return

AutoHotKey 소스코드 입니다.

; 활성창을 해당 모니터 영역의 좌측 1/2영역에 배치
^+1::
	WinGetActiveTitle, title
	WinGetPos, x, y, Width, Height, %title%
	SysGet, MonitorCount, MonitorCount
	Loop, %MonitorCount%
	{
		SysGet, Monitor, Monitor, %A_Index%
		SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
		if (MonitorWorkAreaLeft < MonitorWorkAreaRight){
			half_width := (MonitorWorkAreaRight - MonitorWorkAreaLeft) / 2
		}
		else {
			half_width := (MonitorWorkAreaLeft - MonitorWorkAreaRight) / 2
		}
		if ( x >= MonitorWorkAreaLeft && x < MonitorWorkAreaRight )
		{
			;MsgBox, 'Target Monitor NO: ' %A_Index%
			WinMove, %title%, , MonitorLeft, MonitorTop, half_width, MonitorWorkAreaBottom
			Break
		}
	}
	return

; 활성창을 해당 모니터 영역의 우측 1/2영역에 배치
^+2::
	WinGetActiveTitle, title
	WinGetPos, x, y, Width, Height, %title%
	SysGet, MonitorCount, MonitorCount
	Loop, %MonitorCount%
	{
		SysGet, Monitor, Monitor, %A_Index%
		SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
		if (MonitorWorkAreaLeft < MonitorWorkAreaRight){
			half_width := (MonitorWorkAreaRight - MonitorWorkAreaLeft) / 2
		}
		else {
			half_width := (MonitorWorkAreaLeft - MonitorWorkAreaRight) / 2
		}
		if ( x >= MonitorWorkAreaLeft && x < MonitorWorkAreaRight )
		{
			;MsgBox, 'Target Monitor NO: ' %A_Index%
			WinMove, %title%, , MonitorLeft + half_width, MonitorTop, half_width, MonitorWorkAreaBottom
			Break
		}
	}
	return

15년간 항상 가벼운 노트북만

(노트북을 항상 가지고 다니며 업무와 개인 취미 생활(코딩, 크롤링 등)을 하다보니)

사용하다보니 게임을 못하는건 차지하고라도

아이들 동영상 편집하는 것도 버벅여서 힘들었습니다.

제가 LG gram을 2018년에 구매하고 2019년 후반인가? LG gram 사은품으로 Zotac egpu를 주더라고요,

각종 sns의 설명으로는 2019년 제품부터 지원한다고 하는데

제 노트북이 썬더볼트도 지원하는데 정말 안될까? 하지만 테스트해볼 곳도 없어 1~2년을 망설였습니다.

물론 여러 게시물에 보면 호환성이 나쁘다는 말도 많았고요,

돈 버린다 생각하고 질렀습니다.

결과는 대 만족

발로란트 & 녹스 에뮬레이터 1대 를 월활하게 구동 가능 하더군요.

혹시 구매 의향이 있으나 선능 및 연결이 어떻게 되는지 궁금해 하실 분들을 위해서 

제 노트북 및 그래픽 카드 정보 & 연결 정보 공유 합니다.

설치
연결 정보

TSpider 는 MariaDB의 Spider 엔진을 기반으로 텐센트에서 기능을 추가하여 수정한 엔진 입니다.

Spider 에 대한 자세한 설명은 : https://rastalion.me/spider-%EC%97%94%EC%A7%84%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%83%A4%EB%94%A9-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-01/

 

SPIDER 엔진을 이용한 샤딩 환경 구축 #01 - RastaLion's IT Blog

  Spider 엔진? Spider 스토리지 엔진은 샤딩 기능이 내장 된 스토리지 엔진입니다. 파티셔닝 및 xa 트랜잭션을 지원하며 다른 MariaDB 인스턴스의 테이블을 마치 동일한 인스턴스에있는 것처럼 처리

rastalion.me

 

Spider 와 달리 TSpider에서는 샤드키를 정의하기위해 CRC32()함수를 사용할 수 있다는 점이 큰 차이점 입니다.

crc32 함수를 통하여 문자형 컬럼도 샤드키로 사용할 수 있습니다.

Spider TSpider

 

 

 

 

또한 tdbcl 을 통하여 TSpider DB에서 일반적은 Create 구문을 실행하면 tdbcl이 자동으로 Spider 구문으로 변경하여

Spider DB에 테이블을 생성하며, 또한 자동으로 각 node 에 도 동일한 구조의 테이블을 생성 합니다.

이후 Spider DB에서 조회 쿼리등을 실행하여 됩니다.

자세한 사항은 아래 주소의 공식 문서를 참고하시면 됩니다.

✔ TenDB Cluster(TSpider) 공식 문서 : tendbcluster.net/book-en/

 

Introduction · TenDB Cluster Manual

No results matching ""

tendbcluster.net

TenDB Cluster 구성도

TSpider 구성도

 

다음으로는 TendbCluster(TSpider)를 Docker 환경으로 구축하는 방법을 설명 드리겠습니다.

단일 PC에 동일 버전의 MySQL(MariaDB)을 2개 설치하기 위해서는 Installer 파일로는 설치가 되지 않습니다.

그럴경우 직접 기존 설치된 폴더를 복사하여 MySQL을 구동하는 방법을 설명 드리겠습니다.

현재 제 노트북에는 MySQL 이 2개 , MariaDB 가 2개 설치되어 있습니다.

이 중 MySQL 8.0버전의 DB를 하다 더 설치 및 구동해 보겠습니다.

 

1. MySQL Server 8.0 설치 & 데이터 폴더 복사

  - 총 2개 폴더를 복사하여 다른 이름으로 붙여넣기 해주셔야 합니다.

  - 저는 _Sub_1 으로 복사하겠습니다.

    ✔ 프로그램 폴더

원본 복사
c:\Program Files\MySQL\MySQL Server 8.0\ c:\Program Files\MySQL\MySQL Server 8.0_Sub_1\

    ✔ 데이터 폴더

원본 복사
c:\ProgramData\MySQL\MySQL Server 8.0\  

 

2. 복사한 데이터 폴더의 my.ini 수정

    ✔ port, report_port, datadir, basedir 항목의 값을 변경합니다. 4개 항목 외 기존 경로 및 port가 지정된 항목은 함께 수정해 주어야 합니다.

원본 복사

 

3. MySQL Install 명령어 실행 & 서비스 등록

    ✔ 복사한 프로그램 폴더로 이동하여 아래와 같이 Install 명령 실행

    ✔ [복사한프로그램폴더\bin\mysqld.exe] --install  [서비스명] --defaults-file="복사한 데이터 폴더의 ini파일"

    ✔ Ex:  "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --install MySQL57_25000 --defaults-file="F:\MySQL\MySQL Server 5.7_25000\my.ini"

  • 위에서 입력한 서비스명으로 서비스탭에 등록 됩니다.
  • 반드시 관리자 권한으로 CMD를 실행하셔야 서비스가 정상 등록됩니다.
  • 꼭 복사한 프로그램폴더의 mysqld 실행 파일의 경로를 명시해 주시길 바랍니다.

 

4. 서비스 시작

    ✔ 서비스 탭에서 시작 버튼을 눌러 주시면 됩니다.

설명에 사용한 MySQL 버전 : 5.7.20

 

1. Scheduler 확인

show global variables like '%schedule%';

사용 가능할 경우 ON, 그렇지 않을 경우 OFF 로 표시 됩니다.

1-1. Scheduler 사용 설정

   ini를 수정하게 되면 MySQL 을 재시작 해주어야 합니다. 그렇지 않을 경우 ini 수정 후 set global 명령어를 통해서

   수동으로 설정을 변경해 주시면 됩니다. 추후 재시작 하게되면 그때부터는 ini의 설정에 따라서 동작 하게 됩니다.

    ini 에 아래 구문을 추가합니다. 

event_scheduler = 1

혹은 

event_scheduler = ON

   "1" 이나 "ON" 이나 동일하게 동작(설정) 됩니다.

1-2. Process 확인

show processlist;

 Scheduler 설정을 정상적으로 완료하였을 경우 아래와 같이 event_scheduler 데몬이 접속 중임이 확인 됩니다.

 

2. Schedule 생성

  ◈ Schedule 은 DB에 종속되기에 명령을 실행할 DB가 선택된 상태에서 생성해야 합니다.

DROP EVENT IF EXISTS `calc_ranking`;
DELIMITER $
CREATE EVENT IF NOT EXISTS `calc_ranking`
ON SCHEDULE
	EVERY 5 HOUR                  -- 5시간 마다 실행 (사용 가능 형식: second, minute, day)
	STARTS '2020-01-01 00:00:00'  -- 지정하지 않을 경우 현재 시간부터 5시간 경과 후에 첫 스케줄러가 동작됨
ON COMPLETION PRESERVE
ENABLE
COMMENT 'calc_profile_ranking'
DO 
BEGIN
    call test_procedure(1);
    UPDATE tbl_test set action_status = 1;
END$
DELIMITER ;

  - 매일 5시에 실행되는 작업을 만들고 싶을 경우 ON SCHEDULE 부분을 아래와 같이 수정 합니다.

ON SCHEDULE
	EVERY 1 DAY                   -- 하루에 한번
	STARTS '2020-01-01 05:00:00'  -- 기준 시각이 05시 이기 때문에 매일 5시에 스케줄러 실행

  - 특정 문서의 경우 매일 특정 시간에 실행되는 스케줄을 등록하기 위해 아래와 같은 구문을 사용하는데

그럴 필요 없이 과거 날짜의 특정 시간을 시작시간으로 설정하면 해당 시간 을 기준으로 하루에 한번 실행 됩니다.

STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)

 

3. Schedule 확인

  ◈ Schedule 은 DB에 종속되기에 명령을 실행할 DB가 먼저 선택되어 있어야 합니다.

SHOW EVENTS;	-- 현재 선택된 DB에 등록된 Schedule을 조회 합니다.
or
SELECT * FROM information_schema.EVENTS;  -- 모든 DB에 등록된 설정을 조회 합니다.

SHOW EVENTS
SELECT * FROM information_schema.EVENTS

- Schedule 등록 스크립트를 확인하실 수 있습니다.

SHOW CREATE EVENT `Schedule Name`;
SHOW CREATE EVENT `calc_ranking`;

- Create Event 컬럼의 내용은 아래와 같습니다.

CREATE DEFINER=`root`@`%` EVENT `calc_ranking` 
ON SCHEDULE EVERY 5 HOUR STARTS '2020-01-01 00:00:00' 
ON COMPLETION PRESERVE ENABLE COMMENT 'calc_profile_ranking' 
DO BEGIN
    call test_procedure(1);
    UPDATE tbl_test set action_status = 1;
 END

 

4. 삭제

DROP event `이벤트명`;
DROP EVENT `calc_ranking`;

 

이상 입니다.

특정 테이블의 조회 결과(대량 ROW)를 파일로 저장하고

저정된 결과 파일을 다시 DB(Table)로 저장하는 방법 입니다.

대량의 Row(수백 MB)이기 때문에 쿼리를 통한 Insert가 아닌 load data 명령을 통해 수행 합니다.

  대상 테이블 구조

tbl_user_mode_score

 

  다량의 조회 결과를(1000만건) 파일로 저장하는 쿼리 입니다.

select * from tbl_user_mode_score limit 10000000
INTO OUTFILE 'e:\query_result_1000man.txt'
FIELDS TERMINATED BY '\t'
ENCLOSED BY ''
LINES TERMINATED BY '\n';

  - 조회 결과는 아래와 같습니다. (Field 와 Field 는 탭으로 구분)

Row 수: 1000만건, 시간: 7.203 sec, 파일 크기: 367 MB

 

 

 위 조회 결과를 별도 Table에 저장하는 방법 입니다.

    1. 데이터를 저장할 DB에 조회 내용과 동일한 구조의 테이블을 생성 합니다.

    2. cmd 창에서 mysql 콘솔에 접속 합니다.

    3. 아래 명령어를 실행하여 데이터를 입력 합니다.

load data infile 'e:/query_result_1000man.txt' into table tbl_user_mode_score ( usn, mode_idx, win_cnt, lose_cnt, last_play_date ) ;

    - 입력 완료시 메시지 : 입력 건수 및 오류 상황이 표시 됩니다.

Row 수: 1000만건, 시간: 1 min 6.337 sec

 

이상 입니다.

Oracle 과 MSSQL에 있는 DB Link 서비스를 MySQL에서 지원하는 FEDERATED 엔진을 이용하여 구현하는 방법 입니다.


1. 설치되어 있는 엔진 확인

  - CentOS에서 yum 으로 설치했을때 기본적으로 사용 가능한 엔지들의 목록 입니다.

2. 엔진을 사용할 수 있도록 설치

 

3. FEDERATED 엔진의 설치여부 확인

  - FEDERATED 엔진이 목록에 표시되지만 사용 가능하지 않은 상태 입니다.


4. 엔진 사용 가능 하도록 my.cnf 수정

  - [mysqld] 하위에  federated 항목을 추가 합니다.


5. 엔진의 상태를 확인 합니다.

 - FEDERATED 엔진의 Support 상태가 YES 로 변경 되었습니다.


----------------------------- FEDERATED 엔진을 사용하여 테이블을 생성하여 원격지 테이블과 연결 -------------------------

1. 원격지에 테이블을 생성 합니다.

- 실제 데이터가 입력되는 테이블 입니다.

- 데이터 폴더에는 .frm(구조) / .ibd(데이터) 파일이 생성 됩니다.

CREATE TABLE `cityholic_db`.`cart_product` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '아이디',

  `users_id` bigint(20) unsigned NOT NULL COMMENT '고객아이디',

  `product_id` bigint(20) NOT NULL COMMENT '상품아이디',

  `option_code` varchar(50) NOT NULL COMMENT '상품옵션코드',

  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '상품 개수',

  PRIMARY KEY (`users_id`,`product_id`,`option_code `),

  UNIQUE KEY `id_UNIQUE` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품';


◈ 만약 원격지 DB의 비밀번호에 특수문자'@' 를 사용하는 경우 2번 방식으로는 테이블을 생성할 수 없으니

     2번을 제외하고 3번 항목부터 진행해 주시면 됩니다.


2. 로컬에 테이블을 생성 합니다.

 - 원격지의 테이블을 참조하기 위한 테이블 입니다

 - 데이터 폴더에는 .frm(구조) 파일만 생성 됩니다.

CREATE TABLE `cityholic_db`.`cart_product` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '아이디',

  `users_id` bigint(20) unsigned NOT NULL COMMENT '고객아이디',

  `product_id` bigint(20) NOT NULL COMMENT '상품아이디',

  `option_code` varchar(50) NOT NULL COMMENT '상품옵션코드',

  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '상품 개수',

  PRIMARY KEY (`users_id`,`product_id`,`option_code `),

  UNIQUE KEY `id_UNIQUE` (`id`)

) ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품'

CONNECTION='mysql://root:dldusrn1@10.3.0.27:3306/cityholic_db/cart_product';

   - CONNECTION 옵션의 구성 = 'mysql://[계정]:[비밀번호]@[서버ip]:[port]/[원격지DB명]/[원격지 테이블명]'

   - Pass 에서 특수문자 '@' 를 사용하는 경우 아래와 같이 테이블 생성시 오류가 발생합니다.

     



3. 테이블 생성시 사용할 SERVER 개체를 생성 합니다.

1
2
3
CREATE SERVER [서버명]
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'root', PASSWORD 'XXXX@XXXX', HOST '192.168.197.128', PORT 3306, DATABASE 'db_link_test');
cs

      - 생성된 서버 정보를 조회합니다.

1
SELECT * FROM mysql.servers;
cs


4. 생성된 서버로 테이블을 생성 합니다.

- 로컬에 생성하는 테이블과 원격지 테이블이 동일하다면 CONNECTION 옵션에서 테이블명은 생략 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `cityholic_db`.`cart_product` (
  `id`             bigint(20)     NOT NULL AUTO_INCREMENT COMMENT '아이디',
  `users_id`     bigint(20)     unsigned NOT NULL COMMENT '고객아이디',
  `product_id`     bigint(20)     NOT NULL COMMENT '상품아이디',
  `option_code` varchar(50NOT NULL COMMENT '상품옵션코드',
  `quantity`     int(11)     NOT NULL DEFAULT '0' COMMENT '상품 개수',
 
  PRIMARY KEY (`users_id`,`product_id`,`option_code `),
  UNIQUE KEY `id_UNIQUE` (`id`)
ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품'
CONNECTION='[서버명]/cart_product';
cs


>> . 이상 모든 설정을 완료 했다면 로컬에서 원격지의 Table을 로컬 테이블 처럼 사용 가능합니다. select, insert, update, delete 모두 가능 합니다.


현재 활성화된 창을 특정 위치로 이동하는 명령 입니다.

1
2
3
4
5
; 활성창을 특정 위치로 이동
^1::
    WinGetActiveTitle, title
    WinMove, %title%, , 2020
    return

 

사용해본 클램프 중에서는 Dewalt 제품이 가장 만족도가 높았습니다.

그중에서 M사이즈의 12인치 DWHT83140-KR 제품이 활용도가 높습니다.

Dewalt 규격표
디월트 클램프 짱 좋음

MySQL / MariaDB에서 Slow Query Log를 활성화하기 위한 방법과 실시간으로 변경 가능한 Variable에 대해서 설명드리겠습니다. 

개인적으로는 Slow Query Log를 테이블로 관리하는것을 좋아합니다. 실행된 쿼리 검색 및 통계내가가 편리하기 때문입니다.

아래 3개의 쿼리를 실행하여 설정 가능한 변수를 확인할 수 있습니다. 쿼리 결과

show global variables like '%slow%';

show global variables like '%long%';

show global variables like '%log_output%';

 

>> my.ini 파일 수정 : 노란색 영역의 3개 항목을 추가하신 후 MySQL / MariaDB 서비스를 재시작해주시면 됩니다.

set global 쿼리를 사용해서 설정을 변경할 수 있습니다.

하지만 long_query_time 변수는, 쿼리로는 변경은 가능하지만 실제 반영은 안 되고 있기에 ini 파일에서 설정해 주셔야 합니다.

my.ini 수정

slow_query_log, log_output 은 운용 중인 상태에서 서비스 재시작 없이 설정 변경이 가능하며 즉시 해당 설정이 적용됩니다.

제어판 > 서비스 > 재시작

 

>> 테이블에 기록된 Slow Query 결과입니다.

Slow Query Log in Table

Index 정보를 조회하여 하나의 컬럼에 Key 컬럼을 ','로 구분하여 출력하는 쿼리 입니다.
 
실행 결과)
쿼리)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
select ta.table_name
    , index_name, max(tb.constraint_type) INDEX_DESCRIPTION  
    , concat_ws(', ', max(col_1), max(col_2), max(col_3), max(col_4), max(col_5)  
    , max(col_6), max(col_7), max(col_8), max(col_9), max(col_10)) INDEX_KEYS  
from (  
        select table_schema, `table_name`  
        , (CONSTRAINT_NAME) INDEX_NAME  
        , ('') INDEX_DESCRIPTION  
        , (case ordinal_position when 1 then column_name else null end) col_1  
        , (case ordinal_position when 2 then column_name else null end) col_2  
        , (case ordinal_position when 3 then column_name else null end) col_3  
        , (case ordinal_position when 4 then column_name else null end) col_4  
        , (case ordinal_position when 5 then column_name else null end) col_5  
        , (case ordinal_position when 6 then column_name else null end) col_6  
        , (case ordinal_position when 7 then column_name else null end) col_7  
        , (case ordinal_position when 8 then column_name else null end) col_8  
        , (case ordinal_position when 9 then column_name else null end) col_9  
        , (case ordinal_position when 10 then column_name else null end) col_10  
        from information_schema.KEY_COLUMN_USAGE  
        where table_schema = 'db_schema' and `table_name` like '%info%'  
    ) ta  
left join information_schema.table_constraints tb   
on ta.table_schema = tb.table_schema and ta.`table_name` = tb.`table_name` and ta.index_name = tb.constraint_name  
group by ta.table_name, index_name 
order by ta.table_name, index_name asc
;
 
cs

+ Recent posts