2

当我使用 django 设计网站和 delopy 时,我发现如果我使用 MySQL会激活Binlog(格式:STATEMENT)会有些麻烦。

此部署有我的设置:

  • 基于 Django 的网站
  • uwsgi
  • 宁兴
  • MySQL

第一步,我需要将我的模型迁移到数据库,所以我输入如下:

python manage.py migrate

和这样的回溯:

    django.db.utils.OperationalError: (1665, 'Cannot execute statement: impossible 
    to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table 
    uses a storage engine limited to row-based logging. InnoDB is limited to row- 
    logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.')

在互联网上搜索后,我知道修复它的一种方法是更改​​ Binlog 格式,这对我来说非常有效。

但是如果我不想更改我的 Binlog 配置,我仍然想知道如何修复它。我认为 Django 可以支持这种格式的 Binlog。

4

3 回答 3

2

我遇到了类似的问题,并通过将隔离级别更改为“可重复读取”来修复它。你真的只需要它来应用迁移然后你可能(?)删除它。在 settings.py 中,我将 DATABASES 设置更改为:

DATABASES = {
    'default': {                                                                                         
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',                                                                                 
        'USER': 'db_user',
        'PASSWORD': 'db_password',
        'HOST': 'db_host',
        'PORT': 'db_port',
        'CONN_MAX_AGE': db_conn_max_age,
        'OPTIONS': {                                                                           
            'isolation_level': "repeatable read",                                                        
        },                                                                                     
    }                                                                                            
}

然后运行python manage migrate,然后删除OPTIONS条目。注意这些风险

于 2018-11-27T05:11:18.927 回答
1

你可以尝试将Binlog格式设置为ROW

设置格式请使用这个,

mysql> SET GLOBAL binlog_format = 'ROW';

之后使用以下查询进行确认

mysql> show variables like 'binlog_format';
于 2018-03-16T13:03:42.593 回答
0

经过昨天的搜索,我得到了这个问题的总结性解决方案。

  • 第一种解决方案:更改 Binlog 格式。
    正如 Hariprakash 所说,我们可以更改 Binlog 格式并修复此问题。在大多数情况下,这是修复它的最佳方法。
    您可以通过两种方式更改设置:
    1. Hariprakash 方式,但它只影响会话中的设置。当您关闭会话时,设置将丢失。
    2. 你可以修改Mysql设置文件my.cnf
      my.cnf的,你需要根据自己的选择添加log_bin=mysql-bin设置bin_format=ROW或设置。binformat=MIXED然后,您需要重新启动 Mysql 服务。这将永远有效。

  • 方案二:修改Mysql的默认存储引擎
    在修改默认存储引擎之前,你需要检查一下你支持的引擎有多少种。
    show engines;
    您可以更改默认存储引擎。
    • 在设置文件my.cnf中,你应该在后面插入default-storage-engine=INNODB[mysqld]记住你必须插入server-id=1,这个数字是用来识别你的主机的。不要让其他主机有相同的号码。
    • 您也可以使用 5.5.4 或更早版本的 Mysql 版本,根据Django 文档,它使用 MyISAM 作为默认存储引擎。

虽然有两种方法可以解决问题,但我认为没有最好的解决方案。如果有人有更好的答案,不修改my.cnf,请告诉我。

于 2018-03-17T03:40:17.233 回答