[MySQL] 음수값에 의한 문제 MySQL SQL Errno 1690 UNSIGNED value is out of range
BIGINT UNSIGNED 오류의 문제는 음수를 넣을 수 없는 양의 정수 컬럼에 음수 데이터를 넣으려 할때 발생 합니다.
이 문제는 대체로 프로그램을 통해서 sql 작성이 되므로 음수값이 들어가지 않도록 처리를 하면 됩니다.
또는BIGINT 의 범위값을 넘어갈 수 있다며 생긴 에러.
Last_SQL_Errno: 1690
Last_SQL_Error: Error 'BIGINT UNSIGNED value is out of range in '(view2.viewtotal.total - 1)'' on query. Default database: 'view2'. Query: 'UPDATE view2.viewtotal SET total=total-1 WHERE user=23'
위 쿼리에서 추측해볼 수 있는것은 현재 total 값이 0인것으로 보입니다.
정확한 확인을 위해선 처리 하기전에 select 명령을 내려 확인해 보면 됩니다.
항상 어떤것을 처리하기 전에 왜? 그랬는지 확인하거나 급하면 후에 확인 할 수 있을 정도의 복사등 할 수 있는것이 있을 경우는 해 놓는것이 좋습니다. 그래야 잘못된 외양간을 고칠 수 있습니다.
여기서는 마스터 슬레이브 구조로 되어 있는 경우 처리 방법에 대한 설명이며 데이터베이스 설계할때 왠만하면 음수도 들어가게 하는것이 좋겠습니다.
https://stackoverflow.com/questions/11698613/bigint-unsigned-value-is-out-of-range-my-sql
mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'
mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
| 9223372036854775808 |
+-------------------------------------------+
1 row in set (0.02 sec)
처리방법 1
복제 중에 발생한 경우는 slave가 stop 된 상태이기 때문에
중요도가 덜한것은 아래와 같이 처리해서 넘기는 방법이 있습니다.
set global sql_slave_skip_counter = 1; start slave; select sleep(2); show slave status \G
처리방법 2
MySQL 환경설정 파일에서 /etc/my.cnf 아래와 같이 처리 하지 않도록 하는 방법입니다.
이렇게 하면 영구적으로 오류를 무시 합니다. 단 관리하는 데이터에서 큰 문제가 되지 않는것에서만 이런 처리를 해야하며 그렇지 않은경우는 멈추게하여 문제를 해결해 주는것이 더 좋습니다.
[mysqld]
slave-skip-errors = 1690
