본문 바로가기

MySQL

[MySQL] Replace 함수와 Case 기능 혼합해서 사용 (replace + case) replace에 대한 상세한 내용은 아래 블로그를 참조- replace(대상컬럼명[혹은 대상문자], 찾는문자, 바꿀문자)- https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_replace select + replace 샘플 쿼리) SELECT url, REPLACE(url , "foo=가","bar=가")FROM sample; ----http://www.sample.com?foo=가&id=2http://www.sample.com?bar=가&id=2 update + replace + case 샘플 쿼리) UPDATE sample Seturl = CASE WHEN url LIKE '%foo=가%' THEN REPLACE(url , ..
[MySQL] 쿼리 Process 확인하고 죽이기 개발 환경에서 인덱스를 제거할려고하니 이상하게 transaction wait timeout 때문에 쿼리가 실패하고 있었음 도대체 어떤 쿼리가 오랫동안 lock을 잡고 있었던 걸까? 확인이 필요했음 SHOW PROCESSLIST - 최근에 수행한 쿼리들의 목록을 볼 수 있는 쿼리 - 이 중 State 컬럼의 내용 중 Sending data이라는 상태 값이 있다 대부분 이녀석이 범인인데 Info의 내용을 보고 테이블과 관련있는 쿼리인지 확인이 필요하다. - 롱쿼리나 더 이상 수행이 필요하지 않다면 Id 값을 보고 프로세스 수행을 죽인다. -- ID값을 넣으면 된다. KILL 36581 해당 테이블에 대한 인덱스 제거 쿼리를 수행하면 바로 수행이 끝나는 것을 확인할 수 있다. 그래도 역시 주의해야할 것은 수행..
[MySQL] 테이블의 용량 확인하기 개발환경에서 빅데이터 저장을 연동하다보니 나도모르게 하드디스크 용량이 가득차버린 현상이 있었습니다. 어느 테이블이 문제인지는 짐작이 되지만 정확이 알고 싶어서 구글링해보니 확인할 수 있는 쿼리가 있었습니다. 각 테이블 용량 확인 SELECT (data_length+index_length) tablesize,(data_length+index_length)/power(1024,3) tablesize_gb, information_schema.tables.* FROM information_schema.tables WHERE table_schema='내테이블스키마' ORDER BY tablesize DESC; 전체 테이블 용량 합 SELECT TABLE_SCHEMA AS `Database`, SUM((data_l..
[MySQL] 테이블을 지우지도 만들지도 못할 때.. 테이블만이라도 복구하기 무슨 이유인지..? 개발 환경에서 MySQL 시스템이 이상해졌음 개발 실력 부족으로 원인은 모르겠고 데이터 복구도 어려워보여 테이블이라도 살려보기로 함 우선 에러를 보자 CREATE TABLE foo( id INT(10) UNSIGNED NOT NULL DEFAULT 0 ) ENGINE=InnoDB; - 위의 테이블을 다시 만든다고 가정했을 때 아래와 같은 에러가 발생한다. // 처음 시도시 Lookup Error - MySQL Database Error: Table 'foo' already exists // 이후 시도시 Lookup Error - MySQL Database Error: Can't create table 'foo' (errno: -1) - 에러 내용만 보면 ..뭐지? foo라는 테이블이 ..
[MySQL] 두개의 컬럼을 IN 절로 비교하기 쿼리 조건을 구성하다보면 멀티키와 같은 컬럼 중 일부를 제외하고 싶을 때가 있습니다. 1건이 아니라 여러건을 조회할 때 기대치 : 1-a, 2-b, 3-c만 원할 때 SELECT * FROM foo WHERE id IN (1, 2, 3) AND bar IN ('a', 'b', 'c') 로 구성하면 1-a, 1-b, 1-c.. 3-b, 3-c가 조회됩니다. 교차로 적용되기 때문입니다. 그렇다면 명확하게 1-a, 2-b, 3-c만 매칭하려면.. 정확히 매칭 SELECT * FROM foo WHERE (id, bar) IN ((1, 'a'), (2, 'b'), (3, 'c')) 이 경우 IN절 비교 시 2개의 컬럼을 조합하여 비교합니다. id가 1이고 bar가 'a'인 경우, id가 2이고 bar가 'b'....
Trim 함수를 써서 공백을 모두 제거하기 MySQL의 Trim 함수를 쓰면 문자의 양옆의 공백을 제거해줍니다. 그런데... Column의 타입이 varchar이면 trim이 제대로 적용되지 않는 현상이 있었습니다(탭, 여러 스페이스 등..) 구글링해보니..! 타입 변환을 통해 trim처리를 하면 제대로 제거되는 것을 확인했습니다. 샘플 TRIM(Char(9) FROM 컬럼명) - 이 방식을 쓰게되면 해당 컬럼을 char로 바꾼 뒤 trim을 하기 때문에 공백 문자들이 모두 제거됩니다. SELECT * FROM Foo WHERE Bar IS NOT NULL AND TRIM(Char(9) FROM Bar) '' LIMIT 10; - 뭐 이런식으로 쓸 수 있겠네요. (null도 아니고 공백도 아닌 녀석들만 조회) - 샘플 치고는 나쁜 쿼리네요.. 모..
base64 인코딩/디코딩 MySQL 5.6 이상 버전부터 있는 것 같은데.. Base64로 encode, decode를 지원하는 함수가 있었음 TO_BASE64() : encodeFROM_BASE64() : decode 참고 : http://stackoverflow.com/questions/358500/base64-encode-in-mysql
JPA + MySQL 파이프가 깨어짐 (Disconnector) 환경 - JDK 1.8 (java) - SpringBoot - MySQL - JPA Disconnect에 대한 테스트 (예외 발생) spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver # sessionVariables=wait_timeout=20 핵심이다. (해당 세션일 때 wait_timeout의 시간을 20초로 세팅한다.) # 의미 : request가 20초이상 들어오지 않으면 해당 connector의 연결을 끊어버린다. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?sessionVaria..
MySQL 재시작 DB 서버를 운영하다보면 서버를 종료, 재시작이 필요할 때가 있다. 이 경우 2가지 방법으로 처리가 가능 1. sbin의 service 명령어 이용- /sbin/service mysqld start (시작) 혹은 2. mysql.server 이용- mysql설치경로root/share/mysql/mysql.server start (시작)- ./mysql.server status (서버 상태 확인)
SELECT 후 DELETE 하기 참조 링크- http://stackoverflow.com/questions/4562787/how-to-delete-from-select-in-mysql 예) DELETE FROM Alpha WHERE id IN ( SELECT * FROM ( SELECT a.id FROM Alpha a INNER JOIN Beta b ON a.id = b.alpha_id WHERE a.sample = 'hello' AND b.bar = 88 ) temp )