677
669
mtr_commit(&mtr);
672
/*****************************************************************//**
673
Updates the offset information about the end of the MySQL binlog entry
674
which corresponds to the transaction just being committed. In a MySQL
675
replication slave updates the latest master binlog position up to which
676
replication has proceeded. */
682
trx_sys_flush_commit_id(uint64_t commit_id, ulint field, mtr_t* mtr)
679
trx_sys_update_mysql_binlog_offset(
680
/*===============================*/
681
const char* file_name,/*!< in: MySQL log file name */
682
ib_int64_t offset, /*!< in: position in that log file */
683
ulint field, /*!< in: offset of the MySQL log info field in
684
the trx sys header */
685
mtr_t* mtr) /*!< in: mtr */
684
trx_sysf_t* sys_header;
687
trx_sysf_t* sys_header;
689
if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) {
691
/* We cannot fit the name to the 512 bytes we have reserved */
686
696
sys_header = trx_sysf_get(mtr);
688
mlog_write_ull(sys_header + field + TRX_SYS_DRIZZLE_MAX_COMMIT_ID,
698
if (mach_read_from_4(sys_header + field
699
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
700
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
702
mlog_write_ulint(sys_header + field
703
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD,
704
TRX_SYS_MYSQL_LOG_MAGIC_N,
708
if (0 != strcmp((char*) (sys_header + field + TRX_SYS_MYSQL_LOG_NAME),
711
mlog_write_string(sys_header + field
712
+ TRX_SYS_MYSQL_LOG_NAME,
713
(byte*) file_name, 1 + ut_strlen(file_name),
717
if (mach_read_from_4(sys_header + field
718
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH) > 0
719
|| (offset >> 32) > 0) {
721
mlog_write_ulint(sys_header + field
722
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH,
723
(ulint)(offset >> 32),
727
mlog_write_ulint(sys_header + field
728
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW,
729
(ulint)(offset & 0xFFFFFFFFUL),
733
/*****************************************************************//**
734
Stores the MySQL binlog offset info in the trx system header if
735
the magic number shows it valid, and print the info to stderr */
695
trx_sys_read_commit_id(void)
738
trx_sys_print_mysql_binlog_offset(void)
696
739
/*===================================*/
698
trx_sysf_t* sys_header;
703
sys_header = trx_sysf_get(&mtr);
705
trx_sys_commit_id = mach_read_from_8(sys_header + TRX_SYS_DRIZZLE_LOG_INFO
706
+ TRX_SYS_DRIZZLE_MAX_COMMIT_ID);
741
trx_sysf_t* sys_header;
743
ulint trx_sys_mysql_bin_log_pos_high;
744
ulint trx_sys_mysql_bin_log_pos_low;
748
sys_header = trx_sysf_get(&mtr);
750
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO
751
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
752
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
759
trx_sys_mysql_bin_log_pos_high = mach_read_from_4(
760
sys_header + TRX_SYS_MYSQL_LOG_INFO
761
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH);
762
trx_sys_mysql_bin_log_pos_low = mach_read_from_4(
763
sys_header + TRX_SYS_MYSQL_LOG_INFO
764
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW);
766
trx_sys_mysql_bin_log_pos
767
= (((ib_int64_t)trx_sys_mysql_bin_log_pos_high) << 32)
768
+ (ib_int64_t)trx_sys_mysql_bin_log_pos_low;
770
ut_memcpy(trx_sys_mysql_bin_log_name,
771
sys_header + TRX_SYS_MYSQL_LOG_INFO
772
+ TRX_SYS_MYSQL_LOG_NAME, TRX_SYS_MYSQL_LOG_NAME_LEN);
775
"InnoDB: Last MySQL binlog file position %lu %lu,"
777
trx_sys_mysql_bin_log_pos_high, trx_sys_mysql_bin_log_pos_low,
778
trx_sys_mysql_bin_log_name);
783
/*****************************************************************//**
784
Prints to stderr the MySQL master log offset info in the trx system header if
785
the magic number shows it valid. */
788
trx_sys_print_mysql_master_log_pos(void)
789
/*====================================*/
791
trx_sysf_t* sys_header;
796
sys_header = trx_sysf_get(&mtr);
798
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
799
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
800
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
808
"InnoDB: In a MySQL replication slave the last"
809
" master binlog file\n"
810
"InnoDB: position %lu %lu, file name %s\n",
811
(ulong) mach_read_from_4(sys_header
812
+ TRX_SYS_MYSQL_MASTER_LOG_INFO
813
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH),
814
(ulong) mach_read_from_4(sys_header
815
+ TRX_SYS_MYSQL_MASTER_LOG_INFO
816
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW),
817
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
818
+ TRX_SYS_MYSQL_LOG_NAME);
819
/* Copy the master log position info to global variables we can
820
use in ha_innobase.cc to initialize glob_mi to right values */
822
ut_memcpy(trx_sys_mysql_master_log_name,
823
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
824
+ TRX_SYS_MYSQL_LOG_NAME,
825
TRX_SYS_MYSQL_LOG_NAME_LEN);
827
trx_sys_mysql_master_log_pos
828
= (((ib_int64_t) mach_read_from_4(
829
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
830
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH)) << 32)
831
+ ((ib_int64_t) mach_read_from_4(
832
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
833
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW));
708
834
mtr_commit(&mtr);
1212
1338
#else /* !UNIV_HOTBACKUP */
1339
/*****************************************************************//**
1340
Prints to stderr the MySQL binlog info in the system header if the
1341
magic number shows it valid. */
1344
trx_sys_print_mysql_binlog_offset_from_page(
1345
/*========================================*/
1346
const byte* page) /*!< in: buffer containing the trx
1347
system header page, i.e., page number
1348
TRX_SYS_PAGE_NO in the tablespace */
1350
const trx_sysf_t* sys_header;
1352
sys_header = page + TRX_SYS;
1354
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO
1355
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
1356
== TRX_SYS_MYSQL_LOG_MAGIC_N) {
1359
"ibbackup: Last MySQL binlog file position %lu %lu,"
1361
(ulong) mach_read_from_4(
1362
sys_header + TRX_SYS_MYSQL_LOG_INFO
1363
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH),
1364
(ulong) mach_read_from_4(
1365
sys_header + TRX_SYS_MYSQL_LOG_INFO
1366
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW),
1367
sys_header + TRX_SYS_MYSQL_LOG_INFO
1368
+ TRX_SYS_MYSQL_LOG_NAME);
1214
1373
/* THESE ARE COPIED FROM NON-HOTBACKUP PART OF THE INNODB SOURCE TREE
1215
1374
(This code duplicaton should be fixed at some point!)