반응형
반응형
DB를 운영하다보면 가끔씩 데이터를 수정해야하는데 트리거가 걸려있어 함부로 수정할수 없는 경우가 생기곤 합니다.트리거가 걸린상태에서 예를들어 대량의 업데이트나 삭제처리등이 된다면 락이 걸리거나 성능에 엄청난 부하가 가서 문제가 발생하게 됩니다.그렇기 때문에 이럴때는 트리거를 끄고 실행을 해야하는데 트리거를 꺼버리면 많은 사이드이펙트가 발생하고 실제 운영에도 문제가 생기기 때문에 해당방법은 절대 하면 안되는 방법입니다.그렇다면 어떻게 실제 시스템엔 영향을 안가게하고 트리거의 영향없이 쿼리를 실행할수 있을까요?1. MySQL의 한계와 '스위치' 설계결론부터 말하자면 아쉽게도 MySQL은 Oracle이나 PostgreSQL처럼 ALTER TRIGGER DISABLE 같은 명령어를 세션 단위로 지원하지 않습니..
오늘도 어김없이 Mysql에서 작업을 하다가 아래와 같은 오류가 발생했습니다.해당오류는 아주아주 간단한 오류입니다.일단은 이 오류를 알아보기위한 테스트 환경을 먼저 설명해드리겠습니다.테이블 스키마CREATE TABLE `test` ( `SERIAL` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci', `TEST1` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci', `TEST2` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci', `TEST3` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb3_general..
최근 작업하다가 MYSQL에서 INNODB RECORD LOCK이 생기는 현상이 있어서 이를 해결 했던 방법을 적으려 합니다한행의 INDEX를 기준으로 LOCK을 걸어서 해당 행에 SELECT , UPDATE, DELETE 를 하지 못하도록 막아놓은 처리가 RECORD LOCK입니다.이때 LOCK 이 걸리게되면 해당 트랜잭션이 처리가 될때까지 다른 세션에서는 해당 레코드에 어떠한 쿼리를 실행해도 대기 상태에 걸리게 되는데요 이를 강제적으로 처리하는게 해당 LOCK을 건 트랜잭션을 찾아서 KILL 해버리는 방법입니다MY SQL 8.0버젼 부터는 performance_schema.data_locks 에 lock에 관한 정보가 조회되어 나옵니다. SELECT * FROM performance_schem..
MY SQL에서 특정 컬럼명을 포함한 모든 테이블을 조회 하고 싶을 때가 있는데 그럴땐 아래와 같은 쿼리를 작성하면 됩니다. SELECT TABLE_SCHEMA , TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'username' AND TABLE_SCHEMA = 'your_database_name'; 위처럼 INFORMATION_SCHEMA.COLUMNS 뷰는 데이터 베이스의 테이블의 컬럼정보를 제공하며 test라는 컬럼을 column_name에 조건으로 걸어주게된다면 아래와 같이 test라는 컬럼명을 포함한 테이블 명칭이 조회되어 나오게 됩니다. 뿐만아니라 INFORMATION_SCHEMA.COLUMNS 뷰의 컬럼의 내용은 아래와 같습..
My Sql Federated 작업을 하다가 위와 같은 오류가 났습니다. 위 오류는 A서버에서 B서버로 연결을 시도할 때 발생한 오류로 여러가지 시도와 검색을 하였으나 발견하기 힘든 오류였습니다. 그러나 B서버에서 A서버로의 Federated가 성공하는 것을 보고 단순한 권한 설정과 혹은 방화벽 허용 문제라는 것을 금방 알았습니다. 저의 경우에는 위 문제는 단순한 ip 허용 문제였지만 이외에도 max connection 설정, 권한문제 등등 많은 케이스가 있는 것 같습니다.