diff --git a/.gitignore b/.gitignore index d58dd2aa2b8..9eb935f127c 100644 --- a/.gitignore +++ b/.gitignore @@ -138,6 +138,7 @@ scripts/maria_add_gis_sp_bootstrap.sql scripts/galera_new_cluster scripts/galera_recovery scripts/mysql_convert_table_format.pl +scripts/mysql_sys_schema.sql scripts/mysqld_multi.pl scripts/mysqldumpslow.pl scripts/mysqlhotcopy.pl diff --git a/mysql-test/include/maria_empty_logs.inc b/mysql-test/include/maria_empty_logs.inc index f1835c0d2c3..a4f893d7fd4 100644 --- a/mysql-test/include/maria_empty_logs.inc +++ b/mysql-test/include/maria_empty_logs.inc @@ -94,13 +94,15 @@ eval use $default_db; --enable_query_log # -# Ensure that we don't get warnings from mysql.priv (used by check_mysqld) -# or test running after this one. +# Ensure that we don't get warnings from mysql.priv (used by check_mysqld), +# sys_config or from test running after this one. # --disable_query_log --disable_warnings --disable_result_log +# Zerofill all Aria tables in mysql and sys show table status from mysql; +show table status from sys; --enable_result_log --enable_warnings --enable_query_log diff --git a/scripts/sys_schema/tables/sys_config.sql b/scripts/sys_schema/tables/sys_config.sql index 96d48613064..f887d050875 100644 --- a/scripts/sys_schema/tables/sys_config.sql +++ b/scripts/sys_schema/tables/sys_config.sql @@ -24,6 +24,6 @@ CREATE TABLE IF NOT EXISTS sys_config ( value VARCHAR(128), set_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, set_by VARCHAR(128) -) ENGINE = MyISAM; +) ENGINE = Aria; diff --git a/storage/maria/aria_chk.c b/storage/maria/aria_chk.c index 8f7f1b11b6f..0955d467bcb 100644 --- a/storage/maria/aria_chk.c +++ b/storage/maria/aria_chk.c @@ -1588,6 +1588,12 @@ static void descript(HA_CHECK *param, register MARIA_HA *info, char *name) buff[MY_UUID_STRING_LENGTH]= 0; my_uuid2str(share->base.uuid, buff); printf("UUID: %s\n", buff); + if (ma_control_file_inited() && + memcmp(share->base.uuid, maria_uuid, MY_UUID_SIZE)) + printf("Warning: File UUID not match control file UUID! " + "File is probably moved\n" + "It will be updated to new system on first usage if zerofill is " + "not done\n"); pos=buff; if (share->state.changed & STATE_CRASHED) strmov(buff, share->state.changed & STATE_CRASHED_ON_REPAIR ? diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index 91344a835df..8eabc869a82 100644 --- a/storage/maria/ma_create.c +++ b/storage/maria/ma_create.c @@ -20,6 +20,7 @@ #include #include "ma_blockrec.h" #include "trnman_public.h" +#include "trnman.h" #include "ma_crypt.h" #if defined(MSDOS) || defined(__WIN__) @@ -82,6 +83,7 @@ int maria_create(const char *name, enum data_file_type datafile_type, enum en_fieldtype type; enum data_file_type org_datafile_type= datafile_type; MARIA_SHARE share; + TRN tmp_transaction_object; MARIA_KEYDEF *keydef,tmp_keydef; MARIA_UNIQUEDEF *uniquedef; HA_KEYSEG *keyseg,tmp_keyseg; @@ -1084,7 +1086,7 @@ int maria_create(const char *name, enum data_file_type datafile_type, { /* we log the first bytes and then the size to which we extend; this is - not log 1 KB of mostly zeroes if this is a small table. + a log of about 1 KB of mostly zeroes if this is a small table. */ char empty_string[]= ""; LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 4]; @@ -1149,9 +1151,10 @@ int maria_create(const char *name, enum data_file_type datafile_type, called external_lock(), so have no TRN. It does not matter, as all these operations are non-transactional and sync their files. */ + trnman_init_tmp_trn_for_logging_trid(&tmp_transaction_object); if (unlikely(translog_write_record(&lsn, LOGREC_REDO_CREATE_TABLE, - &dummy_transaction_object, NULL, + &tmp_transaction_object, NULL, total_rec_length, sizeof(log_array)/sizeof(log_array[0]), log_array, NULL, NULL) || @@ -1172,7 +1175,7 @@ int maria_create(const char *name, enum data_file_type datafile_type, store LSN into file, needed for Recovery to not be confused if a DROP+CREATE happened (applying REDOs to the wrong table). */ - if (_ma_update_state_lsns_sub(&share, lsn, trnman_get_min_safe_trid(), + if (_ma_update_state_lsns_sub(&share, lsn, tmp_transaction_object.trid, FALSE, TRUE)) goto err; my_free(log_data); diff --git a/storage/maria/ma_delete_all.c b/storage/maria/ma_delete_all.c index c1019c01c66..e06974fed66 100644 --- a/storage/maria/ma_delete_all.c +++ b/storage/maria/ma_delete_all.c @@ -131,7 +131,7 @@ int maria_delete_all_rows(MARIA_HA *info) my_bool error= _ma_state_info_write(share, MA_STATE_INFO_WRITE_DONT_MOVE_OFFSET | MA_STATE_INFO_WRITE_LOCK) || - _ma_update_state_lsns(share, lsn, trnman_get_min_trid(), FALSE, FALSE) || + _ma_update_state_lsns(share, lsn, info->trn->trid, FALSE, FALSE) || _ma_sync_table_files(info); info->trn->rec_lsn= LSN_IMPOSSIBLE; if (error) diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index 9e7106ab5d3..95ee9d636b4 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -568,8 +568,8 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags, memcmp(share->base.uuid, maria_uuid, MY_UUID_SIZE)))))) { DBUG_PRINT("warning", ("table is moved from another system. uuid_diff: %d create_trid: %lu max_trid: %lu", - memcmp(share->base.uuid, maria_uuid, - MY_UUID_SIZE) != 0, + memcmp(share->base.uuid, maria_uuid, + MY_UUID_SIZE) != 0, (ulong) share->state.create_trid, (ulong) trnman_get_max_trid())); if (open_flags & HA_OPEN_FOR_REPAIR) diff --git a/storage/maria/trnman.c b/storage/maria/trnman.c index 56f6c52b2f5..0c7f6c54f5e 100644 --- a/storage/maria/trnman.c +++ b/storage/maria/trnman.c @@ -194,6 +194,7 @@ int trnman_init(TrID initial_trid) DBUG_RETURN(0); } + /* NOTE this could only be called in the "idle" state - no transaction can be @@ -229,6 +230,7 @@ void trnman_destroy() DBUG_VOID_RETURN; } + /* NOTE TrID is limited to 6 bytes. Initial value of the generator @@ -267,7 +269,7 @@ static uint get_short_trid(TRN *trn) } /** - Allocates and initialzies a new TRN object + Allocates and initializes a new TRN object @note the 'wt' parameter can only be 0 in a single-threaded code (or, generally, where threads cannot block each other), otherwise the @@ -384,6 +386,26 @@ TRN *trnman_new_trn(WT_THD *wt) DBUG_RETURN(trn); } + +/* + Initialize a temporary TRN object for logging a new transaction id (trid) + to it. Used by create table to associate a create trid to the table. + + Out: trn->trid is updated with next available trid +*/ + +void trnman_init_tmp_trn_for_logging_trid(TRN *trn) +{ + *trn= dummy_transaction_object; + /* Avoid logging short_id */ + trn->short_id= 1; + /* Trid gets logged in translog_write_record */ + trn->first_undo_lsn= 0; + /* Get next free trid */ + trn->trid= trnman_get_min_safe_trid(); +} + + /* remove a trn from the active list. if necessary - move to committed list and set commit_trid diff --git a/storage/maria/trnman_public.h b/storage/maria/trnman_public.h index a62c98bf078..97b8cc2fff3 100644 --- a/storage/maria/trnman_public.h +++ b/storage/maria/trnman_public.h @@ -58,6 +58,7 @@ uint trnman_has_locked_tables(TRN *trn); void trnman_reset_locked_tables(TRN *trn, uint locked_tables); TRN *trnman_recreate_trn_from_recovery(uint16 shortid, TrID longid); TRN *trnman_get_any_trn(void); +void trnman_init_tmp_trn_for_logging_trid(TRN *trn); TrID trnman_get_min_trid(void); TrID trnman_get_max_trid(void); TrID trnman_get_min_safe_trid();