mysql 8.0 기준

Table 12.11 Date and Time Functions

NameDescription
ADDDATE() Add time values (intervals) to a date value
ADDTIME() Add time
CONVERT_TZ() Convert from one time zone to another
CURDATE() Return the current date
CURRENT_DATE(), CURRENT_DATE Synonyms for CURDATE()
CURRENT_TIME(), CURRENT_TIME Synonyms for CURTIME()
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP Synonyms for NOW()
CURTIME() Return the current time
DATE() Extract the date part of a date or datetime expression
DATE_ADD() Add time values (intervals) to a date value
DATE_FORMAT() Format date as specified
DATE_SUB() Subtract a time value (interval) from a date
DATEDIFF() Subtract two dates
DAY() Synonym for DAYOFMONTH()
DAYNAME() Return the name of the weekday
DAYOFMONTH() Return the day of the month (0-31)
DAYOFWEEK() Return the weekday index of the argument
DAYOFYEAR() Return the day of the year (1-366)
EXTRACT() Extract part of a date
FROM_DAYS() Convert a day number to a date
FROM_UNIXTIME() Format Unix timestamp as a date
GET_FORMAT() Return a date format string
HOUR() Extract the hour
LAST_DAY Return the last day of the month for the argument
LOCALTIME(), LOCALTIME Synonym for NOW()
LOCALTIMESTAMP, LOCALTIMESTAMP() Synonym for NOW()
MAKEDATE() Create a date from the year and day of year
MAKETIME() Create time from hour, minute, second
MICROSECOND() Return the microseconds from argument
MINUTE() Return the minute from the argument
MONTH() Return the month from the date passed
MONTHNAME() Return the name of the month
NOW() Return the current date and time
PERIOD_ADD() Add a period to a year-month
PERIOD_DIFF() Return the number of months between periods
QUARTER() Return the quarter from a date argument
SEC_TO_TIME() Converts seconds to 'hh:mm:ss' format
SECOND() Return the second (0-59)
STR_TO_DATE() Convert a string to a date
SUBDATE() Synonym for DATE_SUB() when invoked with three arguments
SUBTIME() Subtract times
SYSDATE() Return the time at which the function executes
TIME() Extract the time portion of the expression passed
TIME_FORMAT() Format as time
TIME_TO_SEC() Return the argument converted to seconds
TIMEDIFF() Subtract time
TIMESTAMP() With a single argument, this function returns the date or datetime expression; with two arguments, the sum of the arguments
TIMESTAMPADD() Add an interval to a datetime expression
TIMESTAMPDIFF() Subtract an interval from a datetime expression
TO_DAYS() Return the date argument converted to days
TO_SECONDS() Return the date or datetime argument converted to seconds since Year 0
UNIX_TIMESTAMP() Return a Unix timestamp
UTC_DATE() Return the current UTC date
UTC_TIME() Return the current UTC time
UTC_TIMESTAMP() Return the current UTC date and time
WEEK() Return the week number
WEEKDAY() Return the weekday index
WEEKOFYEAR() Return the calendar week of the date (1-53)
YEAR() Return the year
YEARWEEK() Return the year and week

참고

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_adddate

 

MySQL :: MySQL 8.0 Reference Manual :: 12.7 Date and Time Functions

12.7 Date and Time Functions This section describes the functions that can be used to manipulate temporal values. See Section 11.2, “Date and Time Data Types”, for a description of the range of values each date and time type has and the valid formats

dev.mysql.com

문제

MySQL의 like 조건에서 \가 포함된 경우 원하는 형태로 조회가 되지 않음

해결

조건

title 컬럼의 \m가 포함된 형태로 검색 ( 검색 내용에 \ 가 포함 )

1. \를 두개 더 붙인다

where title like '%\\\m%'


2. escape를 사용
   기본적으로 escape가 \로 설정되어 있음. 이걸 다른 문자로 변경(예제는 | 를 사용)

where title like '%|m%' escape '|'

참고

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=leokevin&logNo=220645049628

[요약]

1. MySQL Connector ODBC 설치
2. ODBC 데이터 원본(64) 실행
3. 시스템 DSN에 등록
4. 시스템 DSN에 등록한 이름으로 MSSQL LinkedServer 생성
5. 접속 중 MSDASQL의 스키마 또는 카탈로그 에러시, 연결되 서버 -> 공급자 -> MSDASQL -> 속성 옵션 수정
6. 오픈 쿼리로 실행 ( select * from openquery ( 'DSN이름', 'select * from tbl_a')

 

 


[구성]

Mysql 연결 드라이버 다운

다운로드 받은 파일을 설치

드라이버 설치가 완료되면 윈도우 [서버 관리자]에서 ODBC [데이터 원본]을 실행

ODBC 데이터 원본 관리자에서 [시스템 DSN]탭을 선택하고 [추가]버튼을 클릭

[새 데이터 원본 만들기] 창이 나타나면 MySQL ODBC 5.3 드라이버를 선택

연결 속성에 각 정보를 입력

Database항목에 해당 MySQL/MariaDB의 데이터베이스 목록이 보이지 않는다면 설정이 잘못되었으니 정보를 확인하고 정확하게 입력한다.

ODBC 데이터 원본 추가작업이 완료되면 시스템 데이터 원본 목록에서 사용자가 생성한 연결 정보가 나타난다.

SQL Server의 SSMS 도구에서 [새 연결된 서버]를 실행하여 링크드서버를 등록

서버 유형은 [기타 데이터 원본]에서 공급자를 OLE DB Provider for ODBC Drivers를 선택 한다.

보안 탭에서 사용자 로그인 계정과 비밀번호를 입력

링크드서버 등록이 완료되면 SSMS에서 추가된 링크드서버를 확인


[사용]

아래 스크립트는 분산 쿼리 및 원격 저장 프로시저에 사용되는 링크드서버로그인 정보를 확인한다. 사용자가 생성한 링크드명과 리모트 로그인 정보를 확인 할 수 있다.

exec sp_helplinkedsrvlogin

 

다음 스크립트는 지정된 연결된 서버에서 테이블에 대한 정보를 반환한다.

exec sp_tables_ex 'MARIADB'

 

MySQL/MariaDB 쿼리 조회는 Openquery를 사용한다.

select * from openquery (MARIADB, 'select * from tbl_a')

 

SQL Server에서 스키마 방식으로 링크드서버 데이터를 조회하였을 때 다음과 같은 에러가 발생한다면 공급자 MSDASQL에서 공급자 옵션을 체크해야 한다.

메시지 7313, 수준 16, 상태 1, 줄 1
연결된 서버 "MARIADB"에 대한 공급자 "MSDASQL"의 스키마 또는 카탈로그를 잘못 지정했습니다.

 

스키마 방식의 데이터 조회 오류를 해결 하기 위해 링크드서버에서 공급자를 확장하면 연결 공급자 목록이 나타난다. MSDASQL을 선택하고 속성을 클릭한다.

MSDASQL 공급자 옵션 창이 나타나면 필요한 옵션을 선택한다.

스키마를 사용한 데이터 조회가 가능한 것을 확인 할 수 있다.

SELECT * FROM MARIADB...tbl_a

 

프로시저 호출의 경우 연결된 서버 속성에서 RPC 구성을 활성화해야 쿼리를 실행할 수 있다.

execute ('select * from tbl_a') at MARIADB

 

 

참고 : https://sqlmvp.tistory.com/1072?category=618825 [Data Science Lab]

1. DB 접속 후, into ~ outfile 형식

SELECT order_id,product_name,qty 
FROM orders 
INTO OUTFILE '/tmp/orders.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n'


 * Access deniey 발생 시
 ERROR 1045 (28000): Access denied for user 'user1'@'localhost' (using password: YES)
 
 GRANT FILE ON *.* TO 'kccfres'@'localhost';
 
 
 * secure-file-priv 처리
 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
 
 1. Mysql client 로 연결후 SHOW variable 로 MySQL 환경 변수 확인
   mysql> SHOW VARIABLES LIKE "secure_file_priv";
  +------------------+-----------------------+
  | Variable_name    | Value                 |
  +------------------+-----------------------+
  | secure_file_priv | /var/lib/mysql-files/ |
  +------------------+-----------------------+
  1 row in set (0.02 sec)

2. INTO OUTFILE 의 저장 경로를 위의 secure_file_priv 폴더로 변경
  INTO OUTFILE '/tmp/orders.csv' →  INTO OUTFILE '/var/lib/mysql-files/orders.csv' 
  
3. 쿼리 재실행

2. DB 접속하지 않은 상태에서 실행

mysql -user -pass -e "select cols from orders" dbname > /tmp/orders.csv

//리모트인 경우 
mysql -h {아이피} -user -pass -e "select cols from orders" dbname > /tmp/orders.csv

참고

https://www.lesstif.com/dbms/mysql-client-query-csv-text-54951965.html

https://xn--lg3bu39b.xn--mk1bu44c/77

Version - 5.7

-- 계정 생성

insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject)
values('%', 'account_srv', password('StrongPassword'), '', '', '');

--권한
grant all privileges on *.* to 'account_srv'@'%' identified by 'StrongPassword' with grant option;
grant select, insert, update, delete, execute on *.* to 'account_srv'@'%' identified by 'StrongPassword' with grant option;

flush privileges;

--- 비밀 번호 변경
UPDATE mysql.user SET Password=PASSWORD('StrongPassword') WHERE User='account_srv' AND Host='%';

SET PASSWORD FOR 'account_srv'@'%' = PASSWORD('StrongPassword');

ALTER USER 'account_srv'@'%' identified by 'StrongPassword';

flush privileges;

-- 권한 확인
# show grants for 'user'@'접속위치';
show grants for 'account_srv'@'%';

-- 계정 삭제
# drop user '계정아이디'@'접속위치';
drop user 'account_srv'@'%';

-- 권한 삭제
# revoke all on DB이름.테이블 FROM '계정아이디'@'접속위치';
revoke all on *.* FROM 'account_srv'@'%';

Version - 8.0

-- 사용자 정보 조회 
SELECT user,authentication_string,plugin,host FROM mysql.user; 

-- 사용자 생성 
create user 'account_srv'@'%' identified by 'StrongPassword'; 

-- 권한 부여 
GRANT ALL PRIVILEGES ON *.* TO 'account_srv'@'%'; 
GRANT GRANT OPTION ON *.* TO 'account_srv'@'%'; 

-- 비밀번호 plugin 변경 
ALTER USER 'account_srv'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPassword';
SELECT GROUP_CONCAT(NAME) AS GCN
     , GROUP_CONCAT(NAME SEPARATOR ' ') AS GCN2
     , GROUP_CONCAT(AGE ORDER BY AGE DESC SEPARATOR '-') AS GCA
FROM TB1

GROUP_CONCAT(컬럼명) : 해당 테이블 컬럼 데이터를 ',' 단위로 하나의 열로 모아주는 기능
GROUP_CONCAT(컬럼명 SEPARATOR '값') : 저정된 단위로 여러 컬럼을 하나의 열로 모아주는 기능
GROUP_CONCAT(컬럼명 ORDER BY 값 ASC/DESC) : 오름/내림 차순 결과를 하나의 열로 모아주는 기능

참고자료

https://wakestand.tistory.com/577?category=835537 

 

MySQL GROUP_CONCAT 을 이용해 여러 행의 내용 합치는 방법

MySQL에서 GROUP_CONCAT을 이용해 여러 행의 데이터를 한 행에 합쳐서 보여줄 수 있는데 예제를 보면 테이블의 NAME 컬럼 안에는 '수철' 과 '철수' 가 들어있는 것이 보이는데 GROUP_CONCAT(컬럼명) 을 사용

wakestand.tistory.com

 

  • 문제 : 주기적으로 MySQL과의 접속이 끊어지는 현상
  • 내용 확인 : MySQL error log를 확인해 보면 아래 문구가 기록되어 있음.XXXX [Note] Aborted connection XXXXX to db: 'XXXXX' XXXXX: 'XXXXX' host: '10.10.10.10' (Got timeout reading communication packets)
  • 원인 : MySQL에 접속한 이후 timeout 설정값 보다 오랫동안 요청이 없어서 강제로 접속이 끊어짐.

[timeout 관련 정보 - MySQL 5.7기준]

mysql> show global variables like '%timeout%'; 
   +-----------------------------+----------+ 
   | Variable_name               | Value    | 
   +-----------------------------+----------+ 
   | connect_timeout             | 10       | 
   | delayed_insert_timeout      | 300      | 
   | have_statement_timeout      | YES      | 
   | innodb_flush_log_at_timeout | 1        | 
   | innodb_lock_wait_timeout    | 50       | 
   | innodb_rollback_on_timeout  | OFF      | 
   | interactive_timeout         | 28800    | 
   | lock_wait_timeout           | 31536000 | 
   | net_read_timeout            | 30       | 
   | net_write_timeout           | 60       | 
   | rpl_stop_slave_timeout      | 31536000 | 
   | slave_net_timeout           | 60       | 
   | wait_timeout                | 28800  | 
   +-----------------------------+----------+ 
   13 rows in set (0.01 sec)
  • connect_timeout : MySQL 서버 접속에 접속실패를 메시지를 보내기까지 대기하는 시간
  • delayed_insert_timeout : insert시 delay될 경우 대기하는 시간
  • have_statement_timeout : 
  • innodb_flush_log_at_timeout : 
  • innodb_lock_wait_timeout : innodb에 transaction 처리중 lock이 걸렸을 시 롤백 될때까지 대기하는 시간
  • innodb_rollback_on_timeout : innodb의 마지막 구문을 롤백시킬지 결정하는 파라미터 (timeout은 진행중인 transaction을 중단하고 전체 transaction을 롤백하는 과정에서 발생)
  • interactive_timeout : 활동중인 커넥션이 닫히기 전까지 서버가 대기하는 시간
  • lock_wait_timeout : 
  • net_read_timeout : 서버가 클라이언트로부터 데이터를 읽어들이는 것을 중단하기까지 대기하는 시간
  • net_write_timeout : 
  • rpl_stop_slave_timeout
  • slave_net_timeout : 마스터/슬레이브로 서버가 클라이언트로부터 데이터를 일겅들이는 것을 중단하기까지 대기하는 시간
  • wait_timeout : 활동하지 않는 커넥션을 끊을때까지 서버가 대기하는 시간

 [해결 방안]

  • [어플 로직 수정] MySQL에 접속하는 세션(서버)에 reconnect 로직을 추가
  • [DB 설정 수정] wait_timeout, interactive_timeout 수치를 증가
  • wait_timeout, interactive_timeout 설정 정보
    • wait timeout PropertyValue
Command-Line Format --wait-timeout=#
System Variable wait_timeout
Scope Global, Session
Dynamic Yes
Type Integer
Default Value 28800
Minimum Value 1
Maximum Value (Other) 31536000
Maximum Value (Windows) 2147483
  • interactive timeout PropertyValue
Command-Line Format --interactive-timeout=#
System Variable interactive_timeout
Scope Global, Session
Dynamic Yes
Type Integer
Default Value 28800
Minimum Value 1
  • DB 설정 수정 방법 :
    • set  global session wait_timeout = [설정값]
    • set  global session interactive_timeout = [설정값]
    • [DB 재시작 필요] 아래 설정 값 추가 이후 MySQL 재시작my.cnf 파일에 wait_timeout = [설정값]interactive_timeout = [설정값]
    • [DB 재시작 필요 없음] DB 접속 후 아래 명령어 실행my.cnf 파일에 수정 내용을 추가하지 않으면 DB 재시작 시 초기화됨.

※ 참고 자료 : https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html


to Top