programing

Django 기본 분리 수준 및 DB 이진 로그 형식 오류

css3 2023. 10. 2. 15:22

Django 기본 분리 수준 및 DB 이진 로그 형식 오류

제가 지금 검사를 하고 있는데요django웹 서버사용pytest-django. 트래비스에 대한 테스트/CI에서 MySQL 데이터베이스 서버에서 MariaDB로 전환하려고 합니다. 이를 위해mysqldbpython 패키지를 에pymysql.

MariaDB를 사용할 때 갑자기 모든 데이터베이스 관련 테스트에 대해 이상한 예외가 발생합니다.

pymysql.err.내부 오류: (1665, '문을 실행할 수 없음: BINLOG_FORMAT = STATEMENT이므로 이진 로그에 쓸 수 없으며 하나 이상의 테이블이 행 기반 로깅으로 제한된 저장 엔진을 사용합니다.InnoDB는 트랜잭션 분리 수준이 READ COMITED 또는 READ UNCOMITED'인 경우 행 로깅으로 제한됩니다.

이 예외는 해당 작업에 대한 모든 테스트에서 몇 가지 예외 사항이 포함되어 있지만, 문제의 근본 원인으로 파악했습니다.

travis에서 직접 테스트 스위트를 실행하는 두 가지 작업과 도커(내부 travis)에서 실행하는 다른 작업 중 python 3.6에서 실행하는 작업 중 하나만 실패합니다.

문제의 원인을 대략적으로 이해하고는 있지만, 세부 사항에 대한 많은 정보를 찾을 수 없었고, 갑자기 문제가 발생/발현되는 이유도 찾을 수 없었습니다.이번 장고 문서 문제는 제외하고요.

python3 test job과 django2 dropout python2 지원에 대해서만 트리거가 되는 것을 고려하면 문제가 관련이 있다고 생각하지만 여전히 합리적인/적절한 솔루션을 찾을 수 없는 것 같습니다.여기서 무슨 일이 일어나고 있는지에 대한 원인과 근거를 적어도 일부는 놓치고 있는 것 같습니다.

데이터베이스 구성을 변경하지 않았고 모든 서비스가 기본 설치로 실행되고 있습니다.

참고로, 중요한 걸 놓쳤을 때를 대비해서 홍보를 위한 트래비스 작업입니다.

TL;DR: MariaDB의 최신 버전을 설치하면 문제가 해결되었습니다.

이 문제에 대한 자세한 내용을 읽어보니 근본 원인이 실제로 환경 내 두 기본 구성 간의 충돌 때문이라는 것을 확인할 수 있었습니다.

  1. BINLOG_FORMAT = STATEMENT.

    MariaDB의 문서에 따르면 버전 10.2.4까지는 MariaDB의 기본값이었습니다.트래비스-CI를 사용한 이후로 그리고 트래비스에서 마리아DB를 사용한 방법 때문에CI가 문서화된 버전 10.0은 하드코딩되었으며 따라서 기본값은 위의 값으로 설정되었습니다.

  2. 이 됩니다(으)로되었습니다.READ COMMITTED

    이 Python3 Django> 2.0 READ COMMITTED장고의 기록에 의하면이 구성이 더 안전한 기본값인 것 같습니다.

예제 travis mariadb 스니펫에서 major/minor 버전 문자열 바꾸기:

addons:
  - mariadb: '10.0'

이 인 경우'10.3'한 트래비스이나 MariaDB다를 트래비스를 보다 또는 하도록 했습니다. 이것은 보다 유연한 것으로 기본 설정되었습니다.BINLOG_FORMAT = MIXED배열.

# config as this way, add options
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxx',
        'USER': 'xx',
        'PASSWORD': 'xx',
        'HOST': 'xxx',
        'POST': 'xxx',
        'OPTIONS': {
            'isolation_level': "repeatable read"
        },
    },
}

언급URL : https://stackoverflow.com/questions/51384863/django-default-isolation-level-and-db-binary-log-format-error