677
674
mtr_commit(&mtr);
677
/*****************************************************************//**
678
Updates the offset information about the end of the MySQL binlog entry
679
which corresponds to the transaction just being committed. In a MySQL
680
replication slave updates the latest master binlog position up to which
681
replication has proceeded. */
682
trx_sys_flush_commit_id(uint64_t commit_id, ulint field, mtr_t* mtr)
684
trx_sys_update_mysql_binlog_offset(
685
/*===============================*/
686
const char* file_name,/*!< in: MySQL log file name */
687
ib_int64_t offset, /*!< in: position in that log file */
688
ulint field, /*!< in: offset of the MySQL log info field in
689
the trx sys header */
690
mtr_t* mtr) /*!< in: mtr */
684
trx_sysf_t* sys_header;
692
trx_sysf_t* sys_header;
694
if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) {
696
/* We cannot fit the name to the 512 bytes we have reserved */
686
701
sys_header = trx_sysf_get(mtr);
688
mlog_write_ull(sys_header + field + TRX_SYS_DRIZZLE_MAX_COMMIT_ID,
703
if (mach_read_from_4(sys_header + field
704
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
705
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
707
mlog_write_ulint(sys_header + field
708
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD,
709
TRX_SYS_MYSQL_LOG_MAGIC_N,
713
if (0 != strcmp((char*) (sys_header + field + TRX_SYS_MYSQL_LOG_NAME),
716
mlog_write_string(sys_header + field
717
+ TRX_SYS_MYSQL_LOG_NAME,
718
(byte*) file_name, 1 + ut_strlen(file_name),
722
if (mach_read_from_4(sys_header + field
723
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH) > 0
724
|| (offset >> 32) > 0) {
726
mlog_write_ulint(sys_header + field
727
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH,
728
(ulint)(offset >> 32),
732
mlog_write_ulint(sys_header + field
733
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW,
734
(ulint)(offset & 0xFFFFFFFFUL),
738
/*****************************************************************//**
739
Stores the MySQL binlog offset info in the trx system header if
740
the magic number shows it valid, and print the info to stderr */
695
trx_sys_read_commit_id(void)
743
trx_sys_print_mysql_binlog_offset(void)
696
744
/*===================================*/
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);
746
trx_sysf_t* sys_header;
748
ulint trx_sys_mysql_bin_log_pos_high;
749
ulint trx_sys_mysql_bin_log_pos_low;
753
sys_header = trx_sysf_get(&mtr);
755
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO
756
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
757
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
764
trx_sys_mysql_bin_log_pos_high = mach_read_from_4(
765
sys_header + TRX_SYS_MYSQL_LOG_INFO
766
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH);
767
trx_sys_mysql_bin_log_pos_low = mach_read_from_4(
768
sys_header + TRX_SYS_MYSQL_LOG_INFO
769
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW);
771
trx_sys_mysql_bin_log_pos
772
= (((ib_int64_t)trx_sys_mysql_bin_log_pos_high) << 32)
773
+ (ib_int64_t)trx_sys_mysql_bin_log_pos_low;
775
ut_memcpy(trx_sys_mysql_bin_log_name,
776
sys_header + TRX_SYS_MYSQL_LOG_INFO
777
+ TRX_SYS_MYSQL_LOG_NAME, TRX_SYS_MYSQL_LOG_NAME_LEN);
780
"InnoDB: Last MySQL binlog file position %lu %lu,"
782
trx_sys_mysql_bin_log_pos_high, trx_sys_mysql_bin_log_pos_low,
783
trx_sys_mysql_bin_log_name);
788
/*****************************************************************//**
789
Prints to stderr the MySQL master log offset info in the trx system header if
790
the magic number shows it valid. */
793
trx_sys_print_mysql_master_log_pos(void)
794
/*====================================*/
796
trx_sysf_t* sys_header;
801
sys_header = trx_sysf_get(&mtr);
803
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
804
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
805
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
813
"InnoDB: In a MySQL replication slave the last"
814
" master binlog file\n"
815
"InnoDB: position %lu %lu, file name %s\n",
816
(ulong) mach_read_from_4(sys_header
817
+ TRX_SYS_MYSQL_MASTER_LOG_INFO
818
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH),
819
(ulong) mach_read_from_4(sys_header
820
+ TRX_SYS_MYSQL_MASTER_LOG_INFO
821
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW),
822
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
823
+ TRX_SYS_MYSQL_LOG_NAME);
824
/* Copy the master log position info to global variables we can
825
use in ha_innobase.cc to initialize glob_mi to right values */
827
ut_memcpy(trx_sys_mysql_master_log_name,
828
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
829
+ TRX_SYS_MYSQL_LOG_NAME,
830
TRX_SYS_MYSQL_LOG_NAME_LEN);
832
trx_sys_mysql_master_log_pos
833
= (((ib_int64_t) mach_read_from_4(
834
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
835
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH)) << 32)
836
+ ((ib_int64_t) mach_read_from_4(
837
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
838
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW));
708
839
mtr_commit(&mtr);
1212
1343
#else /* !UNIV_HOTBACKUP */
1344
/*****************************************************************//**
1345
Prints to stderr the MySQL binlog info in the system header if the
1346
magic number shows it valid. */
1349
trx_sys_print_mysql_binlog_offset_from_page(
1350
/*========================================*/
1351
const byte* page) /*!< in: buffer containing the trx
1352
system header page, i.e., page number
1353
TRX_SYS_PAGE_NO in the tablespace */
1355
const trx_sysf_t* sys_header;
1357
sys_header = page + TRX_SYS;
1359
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO
1360
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
1361
== TRX_SYS_MYSQL_LOG_MAGIC_N) {
1364
"ibbackup: Last MySQL binlog file position %lu %lu,"
1366
(ulong) mach_read_from_4(
1367
sys_header + TRX_SYS_MYSQL_LOG_INFO
1368
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH),
1369
(ulong) mach_read_from_4(
1370
sys_header + TRX_SYS_MYSQL_LOG_INFO
1371
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW),
1372
sys_header + TRX_SYS_MYSQL_LOG_INFO
1373
+ TRX_SYS_MYSQL_LOG_NAME);
1214
1378
/* THESE ARE COPIED FROM NON-HOTBACKUP PART OF THE INNODB SOURCE TREE
1215
1379
(This code duplicaton should be fixed at some point!)