На днях я столкнулся с этой проблемой и реализовал более общую версию 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"
}
Да, с - slave-skip-errors=xxx в my.cnf, где xxx - 'все' или сентябрьский список запятой кодов ошибок.
Во-первых, Вы действительно хотите проигнорировать ошибки? Если Вы получаете ошибку, вероятно, что данные больше не находятся в синхронизации. Возможно, то, что Вы хотите, должно отбросить ведомую базу данных и перезапустить синхронизирующий процесс, когда Вы получаете ошибку.
Во-вторых, я думаю ошибка, которую Вы получаете, не, когда Вы копируете объект, который не существует (что это означало бы так или иначе?) - похоже на тиражирование объекта, который уже существует в ведомой базе данных.
Я подозреваю, что проблема главным образом является результатом не запуска в копии достоверных данных. Кажется, что ведущее устройство было скопировано в ведомое устройство; затем репликация была выключена (или отказавшей); и затем это запустило снова, но не давая ведомому устройству шанс догнать то, что это пропустило.
Если у Вас когда-нибудь есть время, когда ведущее устройство может быть закрыто для доступа для записи достаточно долго, чтобы клонировать базу данных и импортировать его в ведомое устройство, это могло бы заставить проблемы уходить.
Современный mysqldump
команды имеют пару опций помочь с установкой последовательной репликации. Выезд --master-data
который поместит двоичный файл журнала и положение в дампе и автоматически установит при загрузке в ведомое устройство. Также --single-transaction
сделает дамп в транзакции так, чтобы никакая блокировка записи не была необходима, чтобы сделать последовательный дамп.
Если ведомое устройство не используется ни для каких записей кроме репликации, авторы MySQL High Performance рекомендуют добавить read_only
на ведомом сервере для предотвращения пользователей от по ошибке изменяющихся данных по ведомому устройству, поскольку это, также создаст те же ошибки, с которыми Вы столкнулись.
Я думаю, вы выполняете репликацию без синхронизации с базой данных, сначала синхронизируйте базу данных и попробуйте репликацию, а серверы генерируют одинаковые уникальные идентификаторы и попытаются установить смещение автоматического включения
остановить подчиненное устройство; установить глобальный sql_slave_skip_counter = 1; start slave;
Вы можете проигнорировать только текущую ошибку и продолжить процесс репликации.