static void process_history_tables(int master_nodeid, int nodeid)
const char *__function_name = "process_history_tables";
const ZBX_TABLE *t;
zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name);
for (t = tables; NULL != t->table; t++)
In the "schema.tmpl -> dbschema.c" an "alerts" table located before an "events" table.
That's why child node tries to sync alerts before events which is wrong.
For every created alert on a child node we will see one record on master node:
20615:20130813:081803.918 [Z3005] query failed:  Cannot add or update a child row: a foreign key constraint fails (`zabbix20node1`.`alerts`, CONSTRAINT `c_alerts_2` FOREIGN KEY (`eventid`) REFERENCES `events` (`eventid`) ON DELETE CASCADE) [insert into alerts (alertid,actionid,eventid,userid,clock,mediatypeid,sendto,subject,message,status,retries,error,nextcheck,esc_step,alerttype) values (200000000000155,200200000000003,200200000000158,200200000000001,1376371079,200200000000001,'email@example.com','OK: Too many processes on Zabbix server','Trigger: Too many processes on Zabbix server
I'm not very sure for below, but still:
Looks like next such message will reference to next alert(s) records because in a previous sync attempt (10 seconds before) required event(s) has been synced and
in current sync session previous alerts can be correctly synced.
Solution: move the "alerts" table definition in "schema.tmpl" below the "events" table.
See also an example in a comment below.