MySQL Binary Log Replication: это может быть установлено проигнорировать ошибки?

На днях я столкнулся с этой проблемой и реализовал более общую версию Encoder для объектов Python, которая может обрабатывать вложенные объекты и наследуемые поля:

import json
import inspect

class ObjectEncoder(json.JSONEncoder):
    def default(self, obj):
        if hasattr(obj, "to_json"):
            return self.default(obj.to_json())
        elif hasattr(obj, "__dict__"):
            d = dict(
                (key, value)
                for key, value in inspect.getmembers(obj)
                if not key.startswith("__")
                and not inspect.isabstract(value)
                and not inspect.isbuiltin(value)
                and not inspect.isfunction(value)
                and not inspect.isgenerator(value)
                and not inspect.isgeneratorfunction(value)
                and not inspect.ismethod(value)
                and not inspect.ismethoddescriptor(value)
                and not inspect.isroutine(value)
            )
            return self.default(d)
        return obj

Пример:

class C(object):
    c = "NO"
    def to_json(self):
        return {"c": "YES"}

class B(object):
    b = "B"
    i = "I"
    def __init__(self, y):
        self.y = y

    def f(self):
        print "f"

class A(B):
    a = "A"
    def __init__(self):
        self.b = [{"ab": B("y")}]
        self.c = C()

print json.dumps(A(), cls=ObjectEncoder, indent=2, sort_keys=True)

Результат:

{
  "a": "A", 
  "b": [
    {
      "ab": {
        "b": "B", 
        "i": "I", 
        "y": "y"
      }
    }
  ], 
  "c": {
    "c": "YES"
  }, 
  "i": "I"
}
11
задан OMG Ponies 26 April 2011 в 03:31
поделиться

6 ответов

Да, с - slave-skip-errors=xxx в my.cnf, где xxx - 'все' или сентябрьский список запятой кодов ошибок.

11
ответ дан 3 December 2019 в 02:42
поделиться

Во-первых, Вы действительно хотите проигнорировать ошибки? Если Вы получаете ошибку, вероятно, что данные больше не находятся в синхронизации. Возможно, то, что Вы хотите, должно отбросить ведомую базу данных и перезапустить синхронизирующий процесс, когда Вы получаете ошибку.

Во-вторых, я думаю ошибка, которую Вы получаете, не, когда Вы копируете объект, который не существует (что это означало бы так или иначе?) - похоже на тиражирование объекта, который уже существует в ведомой базе данных.

Я подозреваю, что проблема главным образом является результатом не запуска в копии достоверных данных. Кажется, что ведущее устройство было скопировано в ведомое устройство; затем репликация была выключена (или отказавшей); и затем это запустило снова, но не давая ведомому устройству шанс догнать то, что это пропустило.

Если у Вас когда-нибудь есть время, когда ведущее устройство может быть закрыто для доступа для записи достаточно долго, чтобы клонировать базу данных и импортировать его в ведомое устройство, это могло бы заставить проблемы уходить.

3
ответ дан 3 December 2019 в 02:42
поделиться

Современный mysqldump команды имеют пару опций помочь с установкой последовательной репликации. Выезд --master-data который поместит двоичный файл журнала и положение в дампе и автоматически установит при загрузке в ведомое устройство. Также --single-transaction сделает дамп в транзакции так, чтобы никакая блокировка записи не была необходима, чтобы сделать последовательный дамп.

1
ответ дан 3 December 2019 в 02:42
поделиться

Если ведомое устройство не используется ни для каких записей кроме репликации, авторы MySQL High Performance рекомендуют добавить read_only на ведомом сервере для предотвращения пользователей от по ошибке изменяющихся данных по ведомому устройству, поскольку это, также создаст те же ошибки, с которыми Вы столкнулись.

1
ответ дан 3 December 2019 в 02:42
поделиться

Я думаю, вы выполняете репликацию без синхронизации с базой данных, сначала синхронизируйте базу данных и попробуйте репликацию, а серверы генерируют одинаковые уникальные идентификаторы и попытаются установить смещение автоматического включения

0
ответ дан 3 December 2019 в 02:42
поделиться

остановить подчиненное устройство; установить глобальный sql_slave_skip_counter = 1; start slave;

Вы можете проигнорировать только текущую ошибку и продолжить процесс репликации.

15
ответ дан 3 December 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: