657
673
sys_header = trx_sysf_get(&mtr);
659
mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE,
660
trx_sys->max_trx_id, &mtr);
675
mlog_write_ull(sys_header + TRX_SYS_TRX_ID_STORE,
676
trx_sys->max_trx_id, &mtr);
661
677
mtr_commit(&mtr);
664
/*****************************************************************//**
665
Updates the offset information about the end of the MySQL binlog entry
666
which corresponds to the transaction just being committed. In a MySQL
667
replication slave updates the latest master binlog position up to which
668
replication has proceeded. */
671
trx_sys_update_mysql_binlog_offset(
672
/*===============================*/
673
const char* file_name,/*!< in: MySQL log file name */
674
ib_int64_t offset, /*!< in: position in that log file */
675
ulint field, /*!< in: offset of the MySQL log info field in
676
the trx sys header */
677
mtr_t* mtr) /*!< in: mtr */
682
trx_sys_flush_commit_id(uint64_t commit_id, ulint field, mtr_t* mtr)
679
trx_sysf_t* sys_header;
681
if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) {
683
/* We cannot fit the name to the 512 bytes we have reserved */
684
trx_sysf_t* sys_header;
688
686
sys_header = trx_sysf_get(mtr);
690
if (mach_read_from_4(sys_header + field
691
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
692
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
694
mlog_write_ulint(sys_header + field
695
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD,
696
TRX_SYS_MYSQL_LOG_MAGIC_N,
700
if (0 != strcmp((char*) (sys_header + field + TRX_SYS_MYSQL_LOG_NAME),
703
mlog_write_string(sys_header + field
704
+ TRX_SYS_MYSQL_LOG_NAME,
705
(byte*) file_name, 1 + ut_strlen(file_name),
709
if (mach_read_from_4(sys_header + field
710
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH) > 0
711
|| (offset >> 32) > 0) {
713
mlog_write_ulint(sys_header + field
714
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH,
715
(ulint)(offset >> 32),
719
mlog_write_ulint(sys_header + field
720
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW,
721
(ulint)(offset & 0xFFFFFFFFUL),
688
mlog_write_ull(sys_header + field + TRX_SYS_DRIZZLE_MAX_COMMIT_ID,
725
/*****************************************************************//**
726
Stores the MySQL binlog offset info in the trx system header if
727
the magic number shows it valid, and print the info to stderr */
730
trx_sys_print_mysql_binlog_offset(void)
695
trx_sys_read_commit_id(void)
731
696
/*===================================*/
733
trx_sysf_t* sys_header;
735
ulint trx_sys_mysql_bin_log_pos_high;
736
ulint trx_sys_mysql_bin_log_pos_low;
740
sys_header = trx_sysf_get(&mtr);
742
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO
743
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
744
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
751
trx_sys_mysql_bin_log_pos_high = mach_read_from_4(
752
sys_header + TRX_SYS_MYSQL_LOG_INFO
753
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH);
754
trx_sys_mysql_bin_log_pos_low = mach_read_from_4(
755
sys_header + TRX_SYS_MYSQL_LOG_INFO
756
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW);
758
trx_sys_mysql_bin_log_pos
759
= (((ib_int64_t)trx_sys_mysql_bin_log_pos_high) << 32)
760
+ (ib_int64_t)trx_sys_mysql_bin_log_pos_low;
762
ut_memcpy(trx_sys_mysql_bin_log_name,
763
sys_header + TRX_SYS_MYSQL_LOG_INFO
764
+ TRX_SYS_MYSQL_LOG_NAME, TRX_SYS_MYSQL_LOG_NAME_LEN);
767
"InnoDB: Last MySQL binlog file position %lu %lu,"
769
trx_sys_mysql_bin_log_pos_high, trx_sys_mysql_bin_log_pos_low,
770
trx_sys_mysql_bin_log_name);
775
/*****************************************************************//**
776
Prints to stderr the MySQL master log offset info in the trx system header if
777
the magic number shows it valid. */
780
trx_sys_print_mysql_master_log_pos(void)
781
/*====================================*/
783
trx_sysf_t* sys_header;
788
sys_header = trx_sysf_get(&mtr);
790
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
791
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
792
!= TRX_SYS_MYSQL_LOG_MAGIC_N) {
800
"InnoDB: In a MySQL replication slave the last"
801
" master binlog file\n"
802
"InnoDB: position %lu %lu, file name %s\n",
803
(ulong) mach_read_from_4(sys_header
804
+ TRX_SYS_MYSQL_MASTER_LOG_INFO
805
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH),
806
(ulong) mach_read_from_4(sys_header
807
+ TRX_SYS_MYSQL_MASTER_LOG_INFO
808
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW),
809
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
810
+ TRX_SYS_MYSQL_LOG_NAME);
811
/* Copy the master log position info to global variables we can
812
use in ha_innobase.cc to initialize glob_mi to right values */
814
ut_memcpy(trx_sys_mysql_master_log_name,
815
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
816
+ TRX_SYS_MYSQL_LOG_NAME,
817
TRX_SYS_MYSQL_LOG_NAME_LEN);
819
trx_sys_mysql_master_log_pos
820
= (((ib_int64_t) mach_read_from_4(
821
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
822
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH)) << 32)
823
+ ((ib_int64_t) mach_read_from_4(
824
sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
825
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW));
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);
826
708
mtr_commit(&mtr);
903
786
sys_header = trx_sysf_get(mtr);
905
788
/* Start counting transaction ids from number 1 up */
906
mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE,
907
ut_dulint_create(0, 1), mtr);
909
/* Reset the rollback segment slots */
910
for (i = 0; i < TRX_SYS_N_RSEGS; i++) {
912
trx_sysf_rseg_set_space(sys_header, i, ULINT_UNDEFINED, mtr);
913
trx_sysf_rseg_set_page_no(sys_header, i, FIL_NULL, mtr);
916
/* The remaining area (up to the page trailer) is uninitialized.
917
Silence Valgrind warnings about it. */
918
UNIV_MEM_VALID(sys_header + (TRX_SYS_RSEGS
919
+ TRX_SYS_N_RSEGS * TRX_SYS_RSEG_SLOT_SIZE
920
+ TRX_SYS_RSEG_SPACE),
921
(UNIV_PAGE_SIZE - FIL_PAGE_DATA_END
923
+ TRX_SYS_N_RSEGS * TRX_SYS_RSEG_SLOT_SIZE
924
+ TRX_SYS_RSEG_SPACE))
925
+ page - sys_header);
789
mach_write_to_8(sys_header + TRX_SYS_TRX_ID_STORE, 1);
791
/* Reset the rollback segment slots. Old versions of InnoDB
792
define TRX_SYS_N_RSEGS as 256 (TRX_SYS_OLD_N_RSEGS) and expect
793
that the whole array is initialized. */
794
ptr = TRX_SYS_RSEGS + sys_header;
795
len = ut_max(TRX_SYS_OLD_N_RSEGS, TRX_SYS_N_RSEGS)
796
* TRX_SYS_RSEG_SLOT_SIZE;
797
memset(ptr, 0xff, len);
799
ut_a(ptr <= page + (UNIV_PAGE_SIZE - FIL_PAGE_DATA_END));
801
/* Initialize all of the page. This part used to be uninitialized. */
802
memset(ptr, 0, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END + page - ptr);
804
mlog_log_string(sys_header, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END
805
+ page - sys_header, mtr);
927
807
/* Create the first rollback segment in the SYSTEM tablespace */
928
page_no = trx_rseg_header_create(TRX_SYS_SPACE, 0, ULINT_MAX, &slot_no,
808
slot_no = trx_sysf_rseg_find_free(mtr);
809
page_no = trx_rseg_header_create(TRX_SYS_SPACE, 0, ULINT_MAX, slot_no,
930
811
ut_a(slot_no == TRX_SYS_SYSTEM_RSEG_ID);
931
ut_a(page_no != FIL_NULL);
812
ut_a(page_no == FSP_FIRST_RSEG_PAGE_NO);
933
814
mutex_exit(&kernel_mutex);
1303
1176
/* Does nothing at the moment */
1179
/*********************************************************************
1180
Creates the rollback segments */
1183
trx_sys_create_rsegs(
1184
/*=================*/
1185
ulint n_rsegs) /*!< number of rollback segments to create */
1187
ulint new_rsegs = 0;
1189
/* Do not create additional rollback segments if
1190
innodb_force_recovery has been set and the database
1191
was not shutdown cleanly. */
1192
if (!srv_force_recovery && !recv_needed_recovery) {
1195
for (i = 0; i < n_rsegs; ++i) {
1197
if (trx_rseg_create() != NULL) {
1205
if (new_rsegs > 0) {
1207
"InnoDB: %lu rollback segment(s) active.\n",
1305
1212
#else /* !UNIV_HOTBACKUP */
1306
/*****************************************************************//**
1307
Prints to stderr the MySQL binlog info in the system header if the
1308
magic number shows it valid. */
1311
trx_sys_print_mysql_binlog_offset_from_page(
1312
/*========================================*/
1313
const byte* page) /*!< in: buffer containing the trx
1314
system header page, i.e., page number
1315
TRX_SYS_PAGE_NO in the tablespace */
1317
const trx_sysf_t* sys_header;
1319
sys_header = page + TRX_SYS;
1321
if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO
1322
+ TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
1323
== TRX_SYS_MYSQL_LOG_MAGIC_N) {
1326
"ibbackup: Last MySQL binlog file position %lu %lu,"
1328
(ulong) mach_read_from_4(
1329
sys_header + TRX_SYS_MYSQL_LOG_INFO
1330
+ TRX_SYS_MYSQL_LOG_OFFSET_HIGH),
1331
(ulong) mach_read_from_4(
1332
sys_header + TRX_SYS_MYSQL_LOG_INFO
1333
+ TRX_SYS_MYSQL_LOG_OFFSET_LOW),
1334
sys_header + TRX_SYS_MYSQL_LOG_INFO
1335
+ TRX_SYS_MYSQL_LOG_NAME);
1340
1214
/* THESE ARE COPIED FROM NON-HOTBACKUP PART OF THE INNODB SOURCE TREE
1341
1215
(This code duplicaton should be fixed at some point!)