mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-24576 Atomic CREATE TABLE
There are a few different cases to consider Logging of CREATE TABLE and CREATE TABLE ... LIKE - If REPLACE is used and there was an existing table, DDL log the drop of the table. - If discovery of table is to be done - DDL LOG create table else - DDL log create table (with engine type) - create the table - If table was created - Log entry to binary log with xid - Mark DDL log completed Crash recovery: - If query was in binary log do nothing and exit - If discoverted table - Delete the .frm file -else - Drop created table and frm file - If table was dropped, write a DROP TABLE statement in binary log CREATE TABLE ... SELECT required a little more work as when one is using statement logging the query is written to the binary log before commit is done. This was fixed by adding a DROP TABLE to the binary log during crash recovery if the ddl log entry was not closed. In this case the binary log will contain: CREATE TABLE xxx ... SELECT .... DROP TABLE xxx; Other things: - Added debug_crash_here() functionality to Aria to be able to test crash in create table between the creation of the .MAI and the .MAD files.
This commit is contained in:
@ -39,7 +39,7 @@
|
||||
#include "thr_lock.h" /* thr_lock_type, THR_LOCK_DATA, THR_LOCK_INFO */
|
||||
#include "thr_timer.h"
|
||||
#include "thr_malloc.h"
|
||||
#include "log_slow.h" /* LOG_SLOW_DISABLE_... */
|
||||
#include "log_slow.h" /* LOG_SLOW_DISABLE_... */
|
||||
#include <my_tree.h>
|
||||
#include "sql_digest_stream.h" // sql_digest_state
|
||||
#include <mysql/psi/mysql_stage.h>
|
||||
@ -50,6 +50,7 @@
|
||||
#include "session_tracker.h"
|
||||
#include "backup.h"
|
||||
#include "xa.h"
|
||||
#include "ddl_log.h" /* DDL_LOG_STATE */
|
||||
|
||||
extern "C"
|
||||
void set_thd_stage_info(void *thd,
|
||||
@ -6027,6 +6028,7 @@ class select_create: public select_insert {
|
||||
MYSQL_LOCK **m_plock;
|
||||
bool exit_done;
|
||||
TMP_TABLE_SHARE *saved_tmp_table_share;
|
||||
DDL_LOG_STATE ddl_log_state_create, ddl_log_state_rm;
|
||||
|
||||
public:
|
||||
select_create(THD *thd_arg, TABLE_LIST *table_arg,
|
||||
@ -6042,7 +6044,10 @@ public:
|
||||
alter_info(alter_info_arg),
|
||||
m_plock(NULL), exit_done(0),
|
||||
saved_tmp_table_share(0)
|
||||
{}
|
||||
{
|
||||
bzero(&ddl_log_state_create, sizeof(ddl_log_state_create));
|
||||
bzero(&ddl_log_state_rm, sizeof(ddl_log_state_rm));
|
||||
}
|
||||
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
|
||||
|
||||
void store_values(List<Item> &values);
|
||||
|
Reference in New Issue
Block a user