675
657
sys_header = trx_sysf_get(&mtr);
677
mlog_write_ull(sys_header + TRX_SYS_TRX_ID_STORE,
678
trx_sys->max_trx_id, &mtr);
659
mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE,
660
trx_sys->max_trx_id, &mtr);
679
661
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. */
684
trx_sys_flush_commit_id(uint64_t commit_id, ulint field, mtr_t* mtr)
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 */
686
trx_sysf_t* sys_header;
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 */
688
688
sys_header = trx_sysf_get(mtr);
690
mlog_write_ull(sys_header + field + TRX_SYS_DRIZZLE_MAX_COMMIT_ID,
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),
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 */
697
trx_sys_read_commit_id(void)
730
trx_sys_print_mysql_binlog_offset(void)
698
731
/*===================================*/
700
trx_sysf_t* sys_header;
705
sys_header = trx_sysf_get(&mtr);
707
trx_sys_commit_id = mach_read_from_8(sys_header + TRX_SYS_DRIZZLE_LOG_INFO
708
+ TRX_SYS_DRIZZLE_MAX_COMMIT_ID);
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));
710
826
mtr_commit(&mtr);
788
903
sys_header = trx_sysf_get(mtr);
790
905
/* Start counting transaction ids from number 1 up */
791
mach_write_to_8(sys_header + TRX_SYS_TRX_ID_STORE, 1);
793
/* Reset the rollback segment slots. Old versions of InnoDB
794
define TRX_SYS_N_RSEGS as 256 (TRX_SYS_OLD_N_RSEGS) and expect
795
that the whole array is initialized. */
796
ptr = TRX_SYS_RSEGS + sys_header;
797
len = ut_max(TRX_SYS_OLD_N_RSEGS, TRX_SYS_N_RSEGS)
798
* TRX_SYS_RSEG_SLOT_SIZE;
799
memset(ptr, 0xff, len);
801
ut_a(ptr <= page + (UNIV_PAGE_SIZE - FIL_PAGE_DATA_END));
803
/* Initialize all of the page. This part used to be uninitialized. */
804
memset(ptr, 0, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END + page - ptr);
806
mlog_log_string(sys_header, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END
807
+ page - sys_header, mtr);
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);
809
927
/* Create the first rollback segment in the SYSTEM tablespace */
810
slot_no = trx_sysf_rseg_find_free(mtr);
811
page_no = trx_rseg_header_create(TRX_SYS_SPACE, 0, ULINT_MAX, slot_no,
928
page_no = trx_rseg_header_create(TRX_SYS_SPACE, 0, ULINT_MAX, &slot_no,
813
930
ut_a(slot_no == TRX_SYS_SYSTEM_RSEG_ID);
814
ut_a(page_no == FSP_FIRST_RSEG_PAGE_NO);
931
ut_a(page_no != FIL_NULL);
816
933
mutex_exit(&kernel_mutex);
1026
1152
if (format_id == ULINT_UNDEFINED) {
1027
1153
/* Format ID was not set. Set it to minimum possible
1029
format_id = DICT_TF_FORMAT_MIN;
1155
format_id = DICT_TF_FORMAT_51;
1032
drizzled::errmsg_printf(drizzled::error::INFO, "InnoDB: highest supported file format is %s",
1033
trx_sys_file_format_id_to_name(DICT_TF_FORMAT_MAX));
1158
ut_print_timestamp(stderr);
1160
" InnoDB: highest supported file format is %s.\n",
1161
trx_sys_file_format_id_to_name(DICT_TF_FORMAT_MAX));
1035
1163
if (format_id > DICT_TF_FORMAT_MAX) {
1037
1165
ut_a(format_id < FILE_FORMAT_NAME_N);
1039
drizzled::errmsg_printf(drizzled::error::ERROR,
1040
"InnoDB: %s: the system tablespace is in a file "
1041
"format that this version doesn't support - %s",
1167
ut_print_timestamp(stderr);
1169
" InnoDB: %s: the system tablespace is in a file "
1170
"format that this version doesn't support - %s\n",
1042
1171
((max_format_id <= DICT_TF_FORMAT_MAX)
1043
1172
? "Error" : "Warning"),
1044
1173
trx_sys_file_format_id_to_name(format_id));
1175
1303
/* Does nothing at the moment */
1178
/*********************************************************************
1179
Creates the rollback segments */
1182
trx_sys_create_rsegs(
1183
/*=================*/
1184
ulint n_rsegs) /*!< number of rollback segments to create */
1186
ulint new_rsegs = 0;
1188
/* Do not create additional rollback segments if
1189
innodb_force_recovery has been set and the database
1190
was not shutdown cleanly. */
1191
if (!srv_force_recovery && !recv_needed_recovery) {
1194
for (i = 0; i < n_rsegs; ++i) {
1196
if (trx_rseg_create() != NULL) {
1204
if (new_rsegs > 0) {
1206
"InnoDB: %lu rollback segment(s) active.\n",
1211
1305
#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);
1213
1340
/* THESE ARE COPIED FROM NON-HOTBACKUP PART OF THE INNODB SOURCE TREE
1214
1341
(This code duplicaton should be fixed at some point!)