Description:
I found the same problem as bug #39171 which has been closed.
A CREATE VIEW statement is executed correctly on a master server, but all slave servers fail to replicate it. Closer inspection shows the statement in the master binary log is wildly different from the original CREATE VIEW SQL.
I believe this to be an issue with the master alone. The slaves all appear to read the same data that is contained in the master binlog.
The binary log shows some kind of recursion. Here is the entry:
[mysql@db3 binlogs]$ mysqlbinlog --start-datetime='2009-03-27 11:57:00' --start-position=125993827 - -stop-position=125998722 db3-bin.000513
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 125993827
#090327 11:57:59 server id 3 end_log_pos 125998722 Query thread_id=12217516 exec_time=0 error_code=0
use titan1/*!*/;
SET TIMESTAMP=1238155079/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=5, @@session.auto_increment_offset=3/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS CREATE OR REPLACE ALGORITHM=MER
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
How to repeat:
To create the view:
CREATE OR REPLACE ALGORITHM = MERGE VIEW `b_subset` AS
SELECT * FROM `b`
WHERE YEAR(first_date) > 2008;
This creates the view on the master but then puts the corrupt entry into its own binlog. The slaves then fail.
Valeriy asked the original reporter for create table statements.
Here is mine:
CREATE TABLE `b` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(20) default 'Mr',
`firstname` varchar(50) default NULL,
`lastname` varchar(50) default NULL,
`cardholder` varchar(50) default NULL,
`address` varchar(45) default NULL,
`city` varchar(20) default NULL,
`country` varchar(20) default NULL,
`state_province` varchar(20) default NULL,
`email` varchar(80) default NULL,
`phone` varchar(20) default NULL,
`fax` varchar(20) default NULL,
`payment` int(2) NOT NULL default '0',
`card_expire` date default NULL,
`card_num` varchar(30) default NULL,
`card_cvv2` varchar(10) default NULL,
`card_ok` tinyint(1) NOT NULL default '0',
`book_date` datetime default NULL,
`first_date` datetime default NULL,
`pick_up_loc` int(11) default NULL,
`drop_off_loc` int(11) default NULL,
`pick_up_time` datetime default NULL,
`drop_off_time` datetime default NULL,
`birth` date default NULL,
`zip` varchar(11) default NULL,
`airline` varchar(20) default NULL,
`flight_no` varchar(20) default NULL,
`info` text,
`reserv_num` int(11) default NULL,
`car_id` int(11) default NULL,
`deposit` decimal(8,2) default NULL,
`need_to_pay` decimal(8,2) default '0.00',
`mfc` int(1) NOT NULL default '0',
`cga` int(1) NOT NULL default '0',
`crf` int(1) NOT NULL default '0',
`state` int(1) NOT NULL default '0',
`state2` int(1) NOT NULL default '0',
`modify` int(1) NOT NULL default '0',
`modify2` int(1) NOT NULL default '0',
`st` int(1) NOT NULL default '0',
`extra_id` varchar(20) default NULL,
`lastmodified` datetime default NULL,
`lastcancelled` datetime default NULL,
`partner_comments` text,
`advice` text,
`archive` int(1) NOT NULL default '0',
`cur` varchar(3) default NULL,
`dest` varchar(20) default NULL,
`pick_up_service` enum('0','1') default NULL,
`drop_off_service` enum('0','1') default NULL,
`airline_pick` varchar(40) default NULL,
`airline_drop` varchar(40) default NULL,
`flight_drop` varchar(40) default NULL,
`flight_pick` varchar(40) default NULL,
`discount_code` varchar(20) default NULL,
`age` int(11) default NULL,
`insurance` varchar(20) default NULL,
`pick_info` text,
`drop_info` text,
`broker_code` varchar(20) default NULL,
`add_driver_age` int(2) default NULL,
`lang` int(10) default '33',
`agent_id` varchar(20) default NULL,
`voucher_type` varchar(10) NOT NULL default '',
`cancelled_by` enum('1','0','2') default '0',
`pnref` varchar(20) default NULL,
`bonus_id` int(7) default NULL,
`mult_usd` decimal(12,10) default NULL,
`temp_booking` int(11) default NULL,
`quote` enum('1','0') default '0',
`reason_for_discount` text,
`issue_no` varchar(20) default NULL,
`card_start_date` date default NULL,
`car_price` decimal(10,2) NOT NULL default '0.00',
`discount` decimal(10,2) NOT NULL default '0.00',
`car_profit` decimal(10,2) NOT NULL default '0.00',
`extra_price_total` decimal(8,2) default NULL,
`extra_price_local` decimal(8,2) default NULL,
`extra_profit` decimal(8,2) default NULL,
`credit_card_charge` decimal(8,2) default NULL,
`drv_fee` decimal(8,2) default NULL,
`drop_off_fee` decimal(8,2) NOT NULL default '0.00',
`origin` varchar(40) NOT NULL default '',
`version` varchar(5) NOT NULL default '',
`exchange_rate` decimal(17,5) NOT NULL default '0.00000',
`bank_status` tinyint(1) NOT NULL default '0',
`bank_status_text` text NOT NULL,
`money_taken` decimal(8,2) default NULL,
`supplier_paid` tinyint(1) NOT NULL default '0',
`extra_deposit` decimal(8,2) NOT NULL default '0.00',
`car_balance` decimal(6,2) default NULL,
`balance` decimal(6,2) default NULL,
`supinfo` text NOT NULL,
`money_moved_now` decimal(8,2) default NULL,
`payment_date` datetime default NULL,
`discount_type` tinyint(1) NOT NULL default '1',
`car_price_net` decimal(8,2) default NULL,
`extra_price_net` decimal(6,2) default NULL,
`bank` varchar(10) default NULL,
`xml_rq` tinyint(4) default '0',
`affiliate_id` mediumint(8) unsigned default NULL,
`commission` int(11) default NULL,
`deposit_mindays` smallint(5) unsigned default '0',
`balance_paydays` smallint(5) unsigned default '0',
`is_deposit` tinyint(1) NOT NULL default '0',
`xml_status` tinyint(4) NOT NULL default '0',
`xml_msg` varchar(254) default NULL,
`xml_ref` varchar(20) default NULL,
`xml_fail_count` tinyint(4) default '0',
`vehicle_type` int(11) NOT NULL,
`xml_your_ref` varchar(13) NOT NULL,
`rate_code` varchar(50) default '',
`real_name` varchar(50) default NULL,
`company_name` varchar(64) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `reserv_num` (`reserv_num`),
KEY `pick_up_time` (`pick_up_time`),
KEY `drop_off_time` (`drop_off_time`),
KEY `lastmodified` (`lastmodified`),
KEY `lastname` (`lastname`),
KEY `car_id` (`car_id`),
KEY `pick_up_loc` (`pick_up_loc`),
KEY `email` (`email`),
KEY `payment_date` (`payment_date`),
KEY `quote` (`quote`),
KEY `commission` (`commission`),
KEY `first_date` (`first_date`),
KEY `version_first_date_pick_up_loc` (`version`,`first_date`,`pick_up_loc`),
KEY `reserv_num_first_date_pick_up_loc` (`reserv_num`,`first_date`,`pick_up_loc`),
KEY `agent_id` (`agent_id`),
KEY `archive_first_date` (`archive`,`first_date`),
KEY `state2` (`state2`),
KEY `mfc_first_date_pick_up_loc` (`mfc`,`first_date`,`pick_up_loc`)
) ENGINE=InnoDB AUTO_INCREMENT=5774245 DEFAULT CHARSET=utf8;
Suggested fix:
My workaround was to create the view on each master then on each slave and issue a sql skip on each machine.
From what I could determine some kind of parse error takes place after the AS word.
Other things I tried were to create the view using the output of SHOW CREATE VIEW on the master then paste this directly into a terminal to work around any character encoding problems. Each failed in the same way.
Except when I inadvertently missed the space in the SELECT statement and ended up issuing a CREATE VIEW AS SELECT`id` AS `id`. Then the binary log contained this:
# at 115782716
#090327 11:55:36 server id 3 end_log_pos 115787611 Query thread_id=12217427 exec_time=0
error_code=0
SET TIMESTAMP=1238154936/*!*/;
SET @@session.auto_increment_increment=5, @@session.auto_increment_offset=3/*!*/;
CREATE OR REPLACE ALGORITHM=MERGE DEFINER=`mysql`@`localhost` SQL SECURITY DEFINER VIEW `b_subset` AS ââo4@^@^@â^Fâ4+^@^@^@`b`.`id` AS `id`,`titan1`.`b`.`title` AS `title`,`titan1`.`b`.`firstname` AS `firstna
me`,`titan1`.`b`.`lastname` AS `lastname`,
etc.