com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\xA5\xAC&g...' for column `{DB 명}`.`{Table 명}`.`{Column}` at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3876) ~[mysql-connector-java-5.1.38.jar:5.1.38]
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) ~[mysql-connector-java-5.1.38.jar:5.1.38]
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) ~[mysql-connector-java-5.1.38.jar:5.1.38]
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) ~[mysql-connector-java-5.1.38.jar:5.1.38]
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) ~[mysql-connector-java-5.1.38.jar:5.1.38]
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) ~[mysql-connector-java-5.1.38.jar:5.1.38]

 

 패치 후 갑자기?! 포틀릿 데이터 저장시 DB에서 오류 발생

 

확인결과 '옵션' 값들이 encodeURIComponent() 통해서 들어가는데, string으로 변환되어 DB 컬럼에 저장시 오류 발생

 

 

해당 컬럼의 character set 변경하여 해결.

HeidiSQL 에서 바로 변경

 

아래 쿼리로도 변경가능

alter table {테이블 이름} change column {컬럼 이름} {컬럼 이름} {컬럼 속성} collate 
'utf8mb4_unicode_ci'

(ex. ALTER TABLE test_column CHANGE COLUMN a_column a_column LONGTEXT NULL DEFAULT NULL
COLLATE 'utf8mb4_unicode_ci' )

 

 

ERROR org.springframework.dao.TransientDataAccessResourceException:
### Error updating database. Cause: java.sql.SQLTransientConnectionException: (conn=3359025)
Lock wait timeout exceeded; try restarting transaction
### The error may involve com.goom.app.iam.mapper.UserTimeMapper.modifyLogOnTime-Inline
### The error occurred while setting parameters
### SQL: UPDATE TIM_USER_TIME SET LAST_LOGON = ?, LAST_LOGOUT = ? WHERE TENANT_ID = ? AND USER_ID = ?
### Cause: java.sql.SQLTransientConnectionException:(conn=3359025)
Lock wait timeout exceeded;try restarting transaction ;SQL []; (conn=3359025)
Lock wait timeout exceeded; try restarting transaction; nested exception is java.sql.SQLTransientConnectionException: (conn=3359025)
Lock wait timeout exceeded; try restarting transaction

앱 모바일 https 로그인 관련 테스트 중 갑자기 잘 되던 로그인이 안돼서.. 뭔가 문제 있나? 하고 iPhone으로도 해보고, 스토어에서 바로 다운받은 앱에서도 해봤는데 안돼서 서버 로그를 확인해보니 해당 로그가 오전 11시부터 다수 발견;

 

이 참에 한번 제대로 알아보자.

-- 모든 프로세스 조회
SHOW FULL PROCESSLIST;

Lock 걸린 테이블이 있으면 status 컬럼에 "Waiting for table metadata lock"이라고 표시됨.

 

락걸린 테이블이 없다.. 뭐지?

참고로 해당 프로세스의 id 값을 이용해 프로세스 종료할 수 있다

-- KILL {id}
KILL 3343315;
-- 락 테이블 조회
SELECT * FROM information_schema.INNODB_LOCKS
-- 대기 중인 락 조회
SELECT * FROM information_schema.INNODB_LOCK_WAITS
-- 트랜잭션 조회
SELECT * FROM information_schema.INNODB_TRX

이번 경우는 트랜잭션의 문제 였다 trx_wait_started 가 몇 시간 전으로 찍혀있었다.

 

트랜잭션은 id(trx_id)가 아닌 trx_mysql_thread_id 값을 이용해 kill 시켜줌

-- kill {trx_mysql_thread_id}
KILL 38299;

 

 

참고 사이트:
https://hjjungdev.tistory.com/153
 

Mysql (Maria) Db 테이블락 확인하고 강제중지 방법.

1. 개요 보통 기본설정의 Rdbms는 Select문을 제외하고 Delete/Update/Insert문에 대해서 테이블 락을 걸게됩니다. 가령 A라는 사람이 Delete Table;의 명령문을 실행한 상태에서 커밋을 치지않는 다면 해당커

hjjungdev.tistory.com

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

대상 테이블(A)

 

INSERT할 테이블(B)

 

INSERT INTO tpt_favorites(TENANT_ID, USER_UID) (SELECT TENANT_ID, USER_UID FROM tim_user_basiC );

 

정상적으로 가져옴.

 

 

주의사항:
1. 복사하고자 하는 컬럼명이 동일해야하고, 컬럼 명은 순서대로 매칭됨
2. 기본 값이 없을 경우 에러 발생됨
3.  WHERE 절, ORDER BY, GROUP BY 적용 가능

 

[추가] A TABLE 특정 컬럼, B TABLE에 INSERT 하는데 중복 데이터 제외하기 

 

INSERT INTO '테이블A' ('테이블A_컬럼1', '테이블A_컬럼2') 
SELECT '테이블B_컬럼1', '테이블B_컬럼2' FROM '테이블B 
WHERE '(테이블B_중복 제외할 컬럼) NOT IN (SELECT '테이블A_컬럼2' FROM '테이블A')


ex)
INSERT INTO tim_user_addr (TENANT_ID, USER_ID) 
SELECT tenant_id, user_uid FROM tim_user_basic WHERE user_uid NOT IN (SELECT user_id FROM tim_user_addr)
### Cause: java.sql.SQLException: Borrow prepareStatement from pool failed ; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; Borrow prepareStatement from pool failed; nested exception is java.sql.SQLException: Borrow prepareStatement from pool failed default ...

어제 패치 후 오류 발생.. 

 

검색해 보니 'dbcp connection pool에서 connection을 가져오지 못하는 상황'이라는 글을 봄.

 

tomcat 로그를 봤더니..

분명히 추가한 table인데 doesn't exist라니..

 

jdbc.properties 확인 후 어제 table 추가한 db가 아닌 다른 db를 보고 있는 것을 확인하고 다시 추가함.

 

쿼리 수행을 위해 prepareStatement 객체를 생성 도중 에러가 생겨서 DBCP에서 connection을 가져오지 못한 상황

 

참고: https://www.cubrid.com/qna/3800823

https://aljjabaegi.tistory.com/402

+ Recent posts