Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
600b965f
Commit
600b965f
authored
Nov 10, 2004
by
guilhem@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge
parents
3eb817a8
6cd218cc
Changes
39
Show whitespace changes
Inline
Side-by-side
Showing
39 changed files
with
394 additions
and
159 deletions
+394
-159
client/mysqldump.c
client/mysqldump.c
+196
-135
include/mysqld_error.h
include/mysqld_error.h
+2
-1
mysql-test/r/consistent_snapshot.result
mysql-test/r/consistent_snapshot.result
+15
-0
mysql-test/r/rpl_rewrite_db.result
mysql-test/r/rpl_rewrite_db.result
+22
-0
mysql-test/t/consistent_snapshot.test
mysql-test/t/consistent_snapshot.test
+41
-0
mysql-test/t/rpl_rewrite_db-slave.opt
mysql-test/t/rpl_rewrite_db-slave.opt
+1
-0
mysql-test/t/rpl_rewrite_db.test
mysql-test/t/rpl_rewrite_db.test
+19
-0
sql/handler.cc
sql/handler.cc
+25
-0
sql/handler.h
sql/handler.h
+3
-1
sql/lex.h
sql/lex.h
+2
-0
sql/log_event.cc
sql/log_event.cc
+10
-13
sql/share/czech/errmsg.txt
sql/share/czech/errmsg.txt
+1
-0
sql/share/danish/errmsg.txt
sql/share/danish/errmsg.txt
+1
-0
sql/share/dutch/errmsg.txt
sql/share/dutch/errmsg.txt
+1
-0
sql/share/english/errmsg.txt
sql/share/english/errmsg.txt
+1
-0
sql/share/estonian/errmsg.txt
sql/share/estonian/errmsg.txt
+1
-0
sql/share/french/errmsg.txt
sql/share/french/errmsg.txt
+1
-0
sql/share/german/errmsg.txt
sql/share/german/errmsg.txt
+1
-0
sql/share/greek/errmsg.txt
sql/share/greek/errmsg.txt
+1
-0
sql/share/hungarian/errmsg.txt
sql/share/hungarian/errmsg.txt
+1
-0
sql/share/italian/errmsg.txt
sql/share/italian/errmsg.txt
+1
-0
sql/share/japanese/errmsg.txt
sql/share/japanese/errmsg.txt
+1
-0
sql/share/korean/errmsg.txt
sql/share/korean/errmsg.txt
+1
-0
sql/share/norwegian-ny/errmsg.txt
sql/share/norwegian-ny/errmsg.txt
+1
-0
sql/share/norwegian/errmsg.txt
sql/share/norwegian/errmsg.txt
+1
-0
sql/share/polish/errmsg.txt
sql/share/polish/errmsg.txt
+1
-0
sql/share/portuguese/errmsg.txt
sql/share/portuguese/errmsg.txt
+1
-0
sql/share/romanian/errmsg.txt
sql/share/romanian/errmsg.txt
+1
-0
sql/share/russian/errmsg.txt
sql/share/russian/errmsg.txt
+1
-0
sql/share/serbian/errmsg.txt
sql/share/serbian/errmsg.txt
+1
-0
sql/share/slovak/errmsg.txt
sql/share/slovak/errmsg.txt
+1
-0
sql/share/spanish/errmsg.txt
sql/share/spanish/errmsg.txt
+1
-0
sql/share/swedish/errmsg.txt
sql/share/swedish/errmsg.txt
+1
-0
sql/share/ukrainian/errmsg.txt
sql/share/ukrainian/errmsg.txt
+1
-0
sql/slave.cc
sql/slave.cc
+5
-2
sql/slave.h
sql/slave.h
+2
-2
sql/sql_lex.h
sql/sql_lex.h
+1
-1
sql/sql_parse.cc
sql/sql_parse.cc
+9
-1
sql/sql_yacc.yy
sql/sql_yacc.yy
+18
-3
No files found.
client/mysqldump.c
View file @
600b965f
...
...
@@ -37,7 +37,7 @@
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
*/
#define DUMP_VERSION "10.
8
"
#define DUMP_VERSION "10.
9
"
#include <my_global.h>
#include <my_sys.h>
...
...
@@ -78,8 +78,8 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick= 1, extended_insert= 1,
lock_tables
=
1
,
ignore_errors
=
0
,
flush_logs
=
0
,
replace
=
0
,
ignore
=
0
,
opt_drop
=
1
,
opt_keywords
=
0
,
opt_lock
=
1
,
opt_compress
=
0
,
opt_delayed
=
0
,
create_options
=
1
,
opt_quoted
=
0
,
opt_databases
=
0
,
opt_alldbs
=
0
,
opt_create_db
=
0
,
opt_
first_slave
=
0
,
opt_set_charset
,
opt_autocommit
=
0
,
opt_
master_data
,
opt_
disable_keys
=
1
,
opt_xml
=
0
,
opt_alldbs
=
0
,
opt_create_db
=
0
,
opt_
lock_all_tables
=
0
,
opt_set_charset
,
opt_autocommit
=
0
,
opt_disable_keys
=
1
,
opt_xml
=
0
,
opt_delete_master_logs
=
0
,
tty_password
=
0
,
opt_single_transaction
=
0
,
opt_comments
=
0
,
opt_compact
=
0
,
opt_hex_blob
=
0
;
...
...
@@ -93,7 +93,9 @@ static char insert_pat[12 * 1024],*opt_password=0,*current_user=0,
*
err_ptr
=
0
;
static
char
compatible_mode_normal_str
[
255
];
static
ulong
opt_compatible_mode
=
0
;
static
uint
opt_mysql_port
=
0
,
err_len
=
0
;
#define MYSQL_OPT_MASTER_DATA_EFFECTIVE_SQL 1
#define MYSQL_OPT_MASTER_DATA_COMMENTED_SQL 2
static
uint
opt_mysql_port
=
0
,
err_len
=
0
,
opt_master_data
;
static
my_string
opt_mysql_unix_port
=
0
;
static
int
first_error
=
0
;
static
DYNAMIC_STRING
extended_row
;
...
...
@@ -183,8 +185,9 @@ static struct my_option my_long_options[] =
(
gptr
*
)
&
opt_delayed
,
(
gptr
*
)
&
opt_delayed
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"delete-master-logs"
,
OPT_DELETE_MASTER_LOGS
,
"Delete logs on master after backup. This automatically enables --first-slave."
,
0
,
0
,
0
,
GET_NO_ARG
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
"Delete logs on master after backup. This automatically enables --master-data."
,
(
gptr
*
)
&
opt_delete_master_logs
,
(
gptr
*
)
&
opt_delete_master_logs
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"disable-keys"
,
'K'
,
"'/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put in the output."
,
(
gptr
*
)
&
opt_disable_keys
,
(
gptr
*
)
&
opt_disable_keys
,
0
,
GET_BOOL
,
NO_ARG
,
1
,
0
,
0
,
0
,
0
,
0
},
...
...
@@ -203,13 +206,18 @@ static struct my_option my_long_options[] =
(
gptr
*
)
&
opt_enclosed
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"fields-escaped-by"
,
OPT_ESC
,
"Fields in the i.file are escaped by ..."
,
(
gptr
*
)
&
escaped
,
(
gptr
*
)
&
escaped
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"first-slave"
,
'x'
,
"
Locks all tables across all databas
es."
,
(
gptr
*
)
&
opt_
first_slave
,
(
gptr
*
)
&
opt_first_slave
,
0
,
GET_BOOL
,
NO_ARG
,
{
"first-slave"
,
'x'
,
"
Deprecated, renamed to --lock-all-tabl
es."
,
(
gptr
*
)
&
opt_
lock_all_tables
,
(
gptr
*
)
&
opt_lock_all_tables
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"flush-logs"
,
'F'
,
"Flush logs file in server before starting dump. "
"Note that if you dump many databases at once (using the option "
"--databases= or --all-databases), the logs will be flushed for "
"each database dumped."
,
"each database dumped. The exception is when using --lock-all-tables "
"or --master-data: "
"in this case the logs will be flushed only once, corresponding "
"to the moment all tables are locked. So if you want your dump and "
"the log flush to happen at the same exact moment you should use "
"--lock-all-tables or --master-data with --flush-logs"
,
(
gptr
*
)
&
flush_logs
,
(
gptr
*
)
&
flush_logs
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"force"
,
'f'
,
"Continue even if we get an sql-error."
,
...
...
@@ -222,17 +230,40 @@ static struct my_option my_long_options[] =
{
"lines-terminated-by"
,
OPT_LTB
,
"Lines in the i.file are terminated by ..."
,
(
gptr
*
)
&
lines_terminated
,
(
gptr
*
)
&
lines_terminated
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"lock-all-tables"
,
'x'
,
"Locks all tables across all databases. This "
"is achieved by taking a global read lock for the duration of the whole "
"dump. Automatically turns --single-transaction and --lock-tables off."
,
(
gptr
*
)
&
opt_lock_all_tables
,
(
gptr
*
)
&
opt_lock_all_tables
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"lock-tables"
,
'l'
,
"Lock all tables for read."
,
(
gptr
*
)
&
lock_tables
,
(
gptr
*
)
&
lock_tables
,
0
,
GET_BOOL
,
NO_ARG
,
1
,
0
,
0
,
0
,
0
,
0
},
{
"master-data"
,
OPT_MASTER_DATA
,
"This causes the master position and filename to be appended to your output. This automatically enables --first-slave."
,
0
,
0
,
0
,
GET_NO_ARG
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
"This causes the binary log position and filename to be appended to the "
"output. If equal to 1, will print it as a CHANGE MASTER command; if equal"
" to 2, that command will be prefixed with a comment symbol. "
"This option will turn --lock-all-tables on, unless "
"--single-transaction is specified too (in which case a "
"global read lock is only taken a short time at the beginning of the dump "
"- don't forget to read about --single-transaction below). In all cases "
"any action on logs will happen at the exact moment of the dump."
"Option automatically turns --lock-tables off."
,
(
gptr
*
)
&
opt_master_data
,
(
gptr
*
)
&
opt_master_data
,
0
,
GET_UINT
,
REQUIRED_ARG
,
0
,
0
,
MYSQL_OPT_MASTER_DATA_COMMENTED_SQL
,
0
,
0
,
0
},
{
"no-autocommit"
,
OPT_AUTOCOMMIT
,
"Wrap tables with autocommit/commit statements."
,
(
gptr
*
)
&
opt_autocommit
,
(
gptr
*
)
&
opt_autocommit
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
/*
Note that the combination --single-transaction --master-data
will give bullet-proof binlog position only if server >=4.1.3. That's the
old "FLUSH TABLES WITH READ LOCK does not block commit" fixed bug.
*/
{
"single-transaction"
,
OPT_TRANSACTION
,
"Dump all tables in single transaction to get consistent snapshot. Mutually exclusive with --lock-tables."
,
"Creates a consistent snapshot by dumping all tables in a single "
"transaction. Works ONLY for tables stored in storage engines which "
"support multiversioning (currently only InnoDB does); the dump is NOT "
"guaranteed to be consistent for other storage engines. Option "
"automatically turns off --lock-tables."
,
(
gptr
*
)
&
opt_single_transaction
,
(
gptr
*
)
&
opt_single_transaction
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"no-create-db"
,
'n'
,
...
...
@@ -472,14 +503,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
char
*
argument
)
{
switch
(
optid
)
{
case
OPT_MASTER_DATA
:
opt_master_data
=
1
;
opt_first_slave
=
1
;
break
;
case
OPT_DELETE_MASTER_LOGS
:
opt_delete_master_logs
=
1
;
opt_first_slave
=
1
;
break
;
case
'p'
:
if
(
argument
)
{
...
...
@@ -527,7 +550,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
case
(
int
)
OPT_OPTIMIZE
:
extended_insert
=
opt_drop
=
opt_lock
=
quick
=
create_options
=
opt_disable_keys
=
lock_tables
=
opt_set_charset
=
1
;
if
(
opt_single_transaction
)
lock_tables
=
0
;
break
;
case
(
int
)
OPT_SKIP_OPTIMIZATION
:
extended_insert
=
opt_drop
=
opt_lock
=
quick
=
create_options
=
...
...
@@ -623,7 +645,19 @@ static int get_options(int *argc, char ***argv)
"%s: You must use option --tab with --fields-...
\n
"
,
my_progname
);
return
(
1
);
}
if
(
opt_single_transaction
)
/* Ensure consistency of the set of binlog & locking options */
if
(
opt_delete_master_logs
&&
!
opt_master_data
)
opt_master_data
=
MYSQL_OPT_MASTER_DATA_COMMENTED_SQL
;
if
(
opt_single_transaction
&&
opt_lock_all_tables
)
{
fprintf
(
stderr
,
"%s: You can't use --single-transaction and "
"--lock-all-tables at the same time.
\n
"
,
my_progname
);
return
(
1
);
}
if
(
opt_master_data
)
opt_lock_all_tables
=
!
opt_single_transaction
;
if
(
opt_single_transaction
||
opt_lock_all_tables
)
lock_tables
=
0
;
if
(
enclosed
&&
opt_enclosed
)
{
...
...
@@ -670,6 +704,36 @@ static void DBerror(MYSQL *mysql, const char *when)
}
/* DBerror */
/*
Sends a query to server, optionally reads result, prints error message if
some.
SYNOPSIS
mysql_query_with_error_report()
mysql_con connection to use
res if non zero, result will be put there with mysql_store_result
query query to send to server
RETURN VALUES
0 query sending and (if res!=0) result reading went ok
1 error
*/
static
int
mysql_query_with_error_report
(
MYSQL
*
mysql_con
,
MYSQL_RES
**
res
,
const
char
*
query
)
{
if
(
mysql_query
(
mysql_con
,
query
)
||
(
res
&&
!
((
*
res
)
=
mysql_store_result
(
mysql_con
))))
{
my_printf_error
(
0
,
"%s: Couldn't execute '%s': %s (%d)"
,
MYF
(
0
),
my_progname
,
query
,
mysql_error
(
mysql_con
),
mysql_errno
(
mysql_con
));
return
1
;
}
return
0
;
}
static
void
safe_exit
(
int
error
)
{
if
(
!
first_error
)
...
...
@@ -717,12 +781,15 @@ static int dbConnect(char *host, char *user,char *passwd)
DBerror
(
&
mysql_connection
,
"when trying to connect"
);
return
1
;
}
/*
As we're going to set SQL_MODE, it would be lost on reconnect, so we
cannot reconnect.
*/
sock
->
reconnect
=
0
;
sprintf
(
buff
,
"/*!40100 SET @@SQL_MODE=
\"
%s
\"
*/"
,
compatible_mode_normal_str
);
if
(
mysql_query
(
sock
,
buff
))
if
(
mysql_query
_with_error_report
(
sock
,
0
,
buff
))
{
fprintf
(
stderr
,
"%s: Can't set the compatible mode %s (error %s)
\n
"
,
my_progname
,
compatible_mode_normal_str
,
mysql_error
(
sock
));
mysql_close
(
sock
);
safe_exit
(
EX_MYSQLERR
);
return
1
;
...
...
@@ -961,7 +1028,7 @@ static uint getTableStructure(char *table, char* db)
result_table
=
quote_name
(
table
,
table_buff
,
1
);
opt_quoted_table
=
quote_name
(
table
,
table_buff2
,
0
);
if
(
!
opt_xml
&&
!
mysql_query
(
sock
,
insert_pat
))
if
(
!
opt_xml
&&
!
mysql_query
_with_error_report
(
sock
,
0
,
insert_pat
))
{
/* using SHOW CREATE statement */
if
(
!
tFlag
)
...
...
@@ -970,10 +1037,8 @@ static uint getTableStructure(char *table, char* db)
char
buff
[
20
+
FN_REFLEN
];
sprintf
(
buff
,
"show create table %s"
,
result_table
);
if
(
mysql_query
(
sock
,
buff
))
if
(
mysql_query
_with_error_report
(
sock
,
0
,
buff
))
{
fprintf
(
stderr
,
"%s: Can't get CREATE TABLE for table %s (%s)
\n
"
,
my_progname
,
result_table
,
mysql_error
(
sock
));
safe_exit
(
EX_MYSQLERR
);
DBUG_RETURN
(
0
);
}
...
...
@@ -1010,10 +1075,8 @@ static uint getTableStructure(char *table, char* db)
mysql_free_result
(
tableRes
);
}
sprintf
(
insert_pat
,
"show fields from %s"
,
result_table
);
if
(
mysql_query
(
sock
,
insert_pat
)
||
!
(
tableRes
=
mysql_store_result
(
sock
)
))
if
(
mysql_query
_with_error_report
(
sock
,
&
tableRes
,
insert_pat
))
{
fprintf
(
stderr
,
"%s: Can't get info about table: %s
\n
error: %s
\n
"
,
my_progname
,
result_table
,
mysql_error
(
sock
));
if
(
path
)
my_fclose
(
sql_file
,
MYF
(
MY_WME
));
safe_exit
(
EX_MYSQLERR
);
...
...
@@ -1053,10 +1116,8 @@ static uint getTableStructure(char *table, char* db)
my_progname
,
mysql_error
(
sock
));
sprintf
(
insert_pat
,
"show fields from %s"
,
result_table
);
if
(
mysql_query
(
sock
,
insert_pat
)
||
!
(
tableRes
=
mysql_store_result
(
sock
)
))
if
(
mysql_query
_with_error_report
(
sock
,
&
tableRes
,
insert_pat
))
{
fprintf
(
stderr
,
"%s: Can't get info about table: %s
\n
error: %s
\n
"
,
my_progname
,
result_table
,
mysql_error
(
sock
));
safe_exit
(
EX_MYSQLERR
);
DBUG_RETURN
(
0
);
}
...
...
@@ -1150,17 +1211,14 @@ static uint getTableStructure(char *table, char* db)
char
buff
[
20
+
FN_REFLEN
];
uint
keynr
,
primary_key
;
sprintf
(
buff
,
"show keys from %s"
,
result_table
);
if
(
mysql_query
(
sock
,
buff
))
if
(
mysql_query
_with_error_report
(
sock
,
&
tableRes
,
buff
))
{
fprintf
(
stderr
,
"%s: Can't get keys for table %s (%s)
\n
"
,
my_progname
,
result_table
,
mysql_error
(
sock
));
if
(
path
)
my_fclose
(
sql_file
,
MYF
(
MY_WME
));
safe_exit
(
EX_MYSQLERR
);
DBUG_RETURN
(
0
);
}
tableRes
=
mysql_store_result
(
sock
);
/* Find first which key is primary key */
keynr
=
0
;
primary_key
=
INT_MAX
;
...
...
@@ -1224,7 +1282,7 @@ static uint getTableStructure(char *table, char* db)
char
show_name_buff
[
FN_REFLEN
];
sprintf
(
buff
,
"show table status like %s"
,
quote_for_like
(
table
,
show_name_buff
));
if
(
mysql_query
(
sock
,
buff
))
if
(
mysql_query
_with_error_report
(
sock
,
&
tableRes
,
buff
))
{
if
(
mysql_errno
(
sock
)
!=
ER_PARSE_ERROR
)
{
/* If old MySQL version */
...
...
@@ -1234,8 +1292,7 @@ static uint getTableStructure(char *table, char* db)
result_table
,
mysql_error
(
sock
));
}
}
else
if
(
!
(
tableRes
=
mysql_store_result
(
sock
))
||
!
(
row
=
mysql_fetch_row
(
tableRes
)))
else
if
(
!
(
row
=
mysql_fetch_row
(
tableRes
)))
{
fprintf
(
stderr
,
"Error: Couldn't read status information for table %s (%s)
\n
"
,
...
...
@@ -1439,22 +1496,14 @@ static void dumpTable(uint numFields, char *table)
fputs
(
"
\n
"
,
md_result_file
);
check_io
(
md_result_file
);
}
if
(
mysql_query
(
sock
,
query
))
{
if
(
mysql_query_with_error_report
(
sock
,
0
,
query
))
DBerror
(
sock
,
"when retrieving data from server"
);
error
=
EX_CONSCHECK
;
goto
err
;
}
if
(
quick
)
res
=
mysql_use_result
(
sock
);
else
res
=
mysql_store_result
(
sock
);
if
(
!
res
)
{
DBerror
(
sock
,
"when retrieving data from server"
);
error
=
EX_CONSCHECK
;
goto
err
;
}
if
(
verbose
)
fprintf
(
stderr
,
"-- Retrieving rows...
\n
"
);
if
(
mysql_num_fields
(
res
)
!=
numFields
)
...
...
@@ -1789,13 +1838,8 @@ static int dump_all_databases()
MYSQL_RES
*
tableres
;
int
result
=
0
;
if
(
mysql_query
(
sock
,
"SHOW DATABASES"
)
||
!
(
tableres
=
mysql_store_result
(
sock
)))
{
my_printf_error
(
0
,
"Error: Couldn't execute 'SHOW DATABASES': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
if
(
mysql_query_with_error_report
(
sock
,
&
tableres
,
"SHOW DATABASES"
))
return
1
;
}
while
((
row
=
mysql_fetch_row
(
tableres
)))
{
if
(
dump_all_tables_in_db
(
row
[
0
]))
...
...
@@ -1848,7 +1892,7 @@ static int init_dumping(char *database)
sprintf
(
qbuf
,
"SHOW CREATE DATABASE WITH IF NOT EXISTS %s"
,
qdatabase
);
if
(
mysql_query
(
sock
,
qbuf
)
||
!
(
dbinfo
=
mysql_store_result
(
sock
)
))
if
(
mysql_query
_with_error_report
(
sock
,
&
dbinfo
,
qbuf
))
{
/* Old server version, dump generic CREATE DATABASE */
fprintf
(
md_result_file
,
...
...
@@ -1917,7 +1961,7 @@ static int dump_all_tables_in_db(char *database)
check_io
(
md_result_file
);
}
if
(
lock_tables
)
mysql_query
(
sock
,
"UNLOCK TABLES"
);
mysql_query
_with_error_report
(
sock
,
0
,
"UNLOCK TABLES"
);
return
0
;
}
/* dump_all_tables_in_db */
...
...
@@ -1966,11 +2010,76 @@ static int dump_selected_tables(char *db, char **table_names, int tables)
check_io
(
md_result_file
);
}
if
(
lock_tables
)
mysql_query
(
sock
,
"UNLOCK TABLES"
);
mysql_query
_with_error_report
(
sock
,
0
,
"UNLOCK TABLES"
);
return
0
;
}
/* dump_selected_tables */
static
int
do_show_master_status
(
MYSQL
*
mysql_con
)
{
MYSQL_ROW
row
;
MYSQL_RES
*
master
;
const
char
*
comment_prefix
=
(
opt_master_data
==
MYSQL_OPT_MASTER_DATA_COMMENTED_SQL
)
?
"-- "
:
""
;
if
(
mysql_query_with_error_report
(
mysql_con
,
&
master
,
"SHOW MASTER STATUS"
))
{
my_printf_error
(
0
,
"Error: Couldn't execute 'SHOW MASTER STATUS': %s"
,
MYF
(
0
),
mysql_error
(
mysql_con
));
return
1
;
}
else
{
row
=
mysql_fetch_row
(
master
);
if
(
row
&&
row
[
0
]
&&
row
[
1
])
{
if
(
opt_comments
)
fprintf
(
md_result_file
,
"
\n
--
\n
-- Position to start replication or point-in-time "
"recovery from
\n
--
\n\n
"
);
fprintf
(
md_result_file
,
"%sCHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;
\n
"
,
comment_prefix
,
row
[
0
],
row
[
1
]);
check_io
(
md_result_file
);
}
mysql_free_result
(
master
);
}
return
0
;
}
static
int
do_flush_tables_read_lock
(
MYSQL
*
mysql_con
)
{
return
mysql_query_with_error_report
(
mysql_con
,
0
,
"FLUSH TABLES WITH READ LOCK"
);
}
static
int
do_unlock_tables
(
MYSQL
*
mysql_con
)
{
return
mysql_query_with_error_report
(
mysql_con
,
0
,
"UNLOCK TABLES"
);
}
static
int
do_reset_master
(
MYSQL
*
mysql_con
)
{
return
mysql_query_with_error_report
(
mysql_con
,
0
,
"RESET MASTER"
);
}
static
int
start_transaction
(
MYSQL
*
mysql_con
,
my_bool
consistent_read_now
)
{
/*
We use BEGIN for old servers. --single-transaction --master-data will fail
on old servers, but that's ok as it was already silently broken (it didn't
do a consistent read, so better tell people frankly, with the error).
*/
return
(
mysql_query_with_error_report
(
mysql_con
,
0
,
consistent_read_now
?
"START TRANSACTION "
"WITH CONSISTENT SNAPSHOT"
:
"BEGIN"
));
}
static
ulong
find_set
(
TYPELIB
*
lib
,
const
char
*
x
,
uint
length
,
char
**
err_pos
,
uint
*
err_len
)
...
...
@@ -2068,7 +2177,7 @@ static const char *check_if_ignore_table(const char *table_name)
sprintf
(
buff
,
"show table status like %s"
,
quote_for_like
(
table_name
,
show_name_buff
));
if
(
mysql_query
(
sock
,
buff
))
if
(
mysql_query
_with_error_report
(
sock
,
&
res
,
buff
))
{
if
(
mysql_errno
(
sock
)
!=
ER_PARSE_ERROR
)
{
/* If old MySQL version */
...
...
@@ -2079,8 +2188,7 @@ static const char *check_if_ignore_table(const char *table_name)
return
0
;
/* assume table is ok */
}
}
if
(
!
(
res
=
mysql_store_result
(
sock
))
||
!
(
row
=
mysql_fetch_row
(
res
)))
if
(
!
(
row
=
mysql_fetch_row
(
res
)))
{
fprintf
(
stderr
,
"Error: Couldn't read status information for table %s (%s)
\n
"
,
...
...
@@ -2099,8 +2207,6 @@ static const char *check_if_ignore_table(const char *table_name)
int
main
(
int
argc
,
char
**
argv
)
{
MYSQL_ROW
row
;
MYSQL_RES
*
master
;
compatible_mode_normal_str
[
0
]
=
0
;
MY_INIT
(
argv
[
0
]);
...
...
@@ -2114,28 +2220,24 @@ int main(int argc, char **argv)
if
(
!
path
)
write_header
(
md_result_file
,
*
argv
);
if
(
opt_first_slave
)
{
lock_tables
=
0
;
/* No other locks needed */
if
(
mysql_query
(
sock
,
"FLUSH TABLES WITH READ LOCK"
))
{
my_printf_error
(
0
,
"Error: Couldn't execute 'FLUSH TABLES WITH READ LOCK': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
my_end
(
0
);
return
(
first_error
);
}
}
else
if
(
opt_single_transaction
)
{
/* There is no sense to start transaction if all tables are locked */
if
(
mysql_query
(
sock
,
"BEGIN"
))
if
((
opt_lock_all_tables
||
opt_master_data
)
&&
do_flush_tables_read_lock
(
sock
))
goto
err
;
if
(
opt_single_transaction
&&
start_transaction
(
sock
,
test
(
opt_master_data
)))
goto
err
;
if
(
opt_delete_master_logs
&&
do_reset_master
(
sock
))
goto
err
;
if
(
opt_lock_all_tables
||
opt_master_data
)
{
my_printf_error
(
0
,
"Error: Couldn't execute 'BEGIN': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
my_end
(
0
);
return
(
first_error
);
}
if
(
flush_logs
&&
mysql_refresh
(
sock
,
REFRESH_LOG
))
goto
err
;
flush_logs
=
0
;
/* not anymore; that would not be sensible */
}
if
(
opt_master_data
&&
do_show_master_status
(
sock
))
goto
err
;
if
(
opt_single_transaction
&&
do_unlock_tables
(
sock
))
// unlock but no commit!
goto
err
;
if
(
opt_alldbs
)
dump_all_databases
();
else
if
(
argc
>
1
&&
!
opt_databases
)
...
...
@@ -2148,57 +2250,16 @@ int main(int argc, char **argv)
/* One or more databases, all tables */
dump_databases
(
argv
);
}
if
(
opt_first_slave
)
{
if
(
opt_delete_master_logs
&&
mysql_query
(
sock
,
"FLUSH MASTER"
))
{
my_printf_error
(
0
,
"Error: Couldn't execute 'FLUSH MASTER': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
}
if
(
opt_master_data
)
{
if
(
mysql_query
(
sock
,
"SHOW MASTER STATUS"
)
||
!
(
master
=
mysql_store_result
(
sock
)))
my_printf_error
(
0
,
"Error: Couldn't execute 'SHOW MASTER STATUS': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
else
{
row
=
mysql_fetch_row
(
master
);
if
(
row
&&
row
[
0
]
&&
row
[
1
])
{
if
(
opt_comments
)
fprintf
(
md_result_file
,
"
\n
--
\n
-- Position to start replication from
\n
--
\n\n
"
);
fprintf
(
md_result_file
,
"CHANGE MASTER TO MASTER_LOG_FILE='%s', \
MASTER_LOG_POS=%s ;
\n
"
,
row
[
0
],
row
[
1
]);
check_io
(
md_result_file
);
}
mysql_free_result
(
master
);
}
}
if
(
mysql_query
(
sock
,
"UNLOCK TABLES"
))
my_printf_error
(
0
,
"Error: Couldn't execute 'UNLOCK TABLES': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
}
else
if
(
opt_single_transaction
)
/* Just to make it beautiful enough */
#ifdef HAVE_SMEM
my_free
(
shared_memory_base_name
,
MYF
(
MY_ALLOW_ZERO_PTR
));
#endif
{
/*
In case we were locking all tables, we did not start transaction
so there is no need to commit it.
No reason to explicitely COMMIT the transaction, neither to explicitely
UNLOCK TABLES: these will be automatically be done by the server when we
disconnect now. Saves some code here, some network trips, adds nothing to
server.
*/
/* This should just free locks as we did not change anything */
if
(
mysql_query
(
sock
,
"COMMIT"
))
{
my_printf_error
(
0
,
"Error: Couldn't execute 'COMMIT': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
}
}
err:
dbDisconnect
(
current_host
);
if
(
!
path
)
write_footer
(
md_result_file
);
...
...
include/mysqld_error.h
View file @
600b965f
...
...
@@ -319,4 +319,5 @@
#define ER_INVALID_CHARACTER_STRING 1300
#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301
#define ER_CONFLICTING_DECLARATIONS 1302
#define ER_ERROR_MESSAGES 303
#define ER_NO_CONS_READ_ENGINE 1303
#define ER_ERROR_MESSAGES 304
mysql-test/r/consistent_snapshot.result
0 → 100644
View file @
600b965f
drop table if exists t1;
create table t1 (a int) engine=innodb;
start transaction with consistent snapshot;
insert into t1 values(1);
select * from t1;
a
commit;
delete from t1;
start transaction;
insert into t1 values(1);
select * from t1;
a
1
commit;
drop table t1;
mysql-test/r/rpl_rewrite_db.result
0 → 100644
View file @
600b965f
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
drop database if exists mysqltest1;
create database mysqltest1;
use mysqltest1;
create table t1 (a int);
insert into t1 values(9);
select * from mysqltest1.t1;
a
9
show databases like 'mysqltest1';
Database (mysqltest1)
mysqltest1
select * from test.t1;
a
9
drop table t1;
drop database mysqltest1;
mysql-test/t/consistent_snapshot.test
0 → 100644
View file @
600b965f
--
source
include
/
have_innodb
.
inc
--
disable_warnings
drop
table
if
exists
t1
;
--
enable_warnings
connect
(
con1
,
localhost
,
root
,,);
connect
(
con2
,
localhost
,
root
,,);
### Test 1:
### - While a consistent snapshot transaction is executed,
### no external inserts should be visible to the transaction.
connection
con1
;
create
table
t1
(
a
int
)
engine
=
innodb
;
start
transaction
with
consistent
snapshot
;
connection
con2
;
insert
into
t1
values
(
1
);
connection
con1
;
select
*
from
t1
;
# if consistent snapshot was set as expected, we
# should see nothing.
commit
;
### Test 2:
### - For any non-consistent snapshot transaction, external
### committed inserts should be visible to the transaction.
delete
from
t1
;
start
transaction
;
# Now we omit WITH CONSISTENT SNAPSHOT
connection
con2
;
insert
into
t1
values
(
1
);
connection
con1
;
select
*
from
t1
;
# if consistent snapshot was not set, as expected, we
# should see 1.
commit
;
drop
table
t1
;
mysql-test/t/rpl_rewrite_db-slave.opt
0 → 100644
View file @
600b965f
"--replicate-rewrite-db=mysqltest1->test"
mysql-test/t/rpl_rewrite_db.test
0 → 100644
View file @
600b965f
source
include
/
master
-
slave
.
inc
;
--
disable_warnings
drop
database
if
exists
mysqltest1
;
--
enable_warnings
create
database
mysqltest1
;
use
mysqltest1
;
create
table
t1
(
a
int
);
insert
into
t1
values
(
9
);
select
*
from
mysqltest1
.
t1
;
sync_slave_with_master
;
show
databases
like
'mysqltest1'
;
# should be empty
select
*
from
test
.
t1
;
# cleanup
connection
master
;
drop
table
t1
;
drop
database
mysqltest1
;
sync_slave_with_master
;
sql/handler.cc
View file @
600b965f
...
...
@@ -583,6 +583,12 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
if
(
opt_using_transactions
)
{
bool
operation_done
=
0
;
/*
As rollback can be 30 times slower than insert in InnoDB, and user may
not know there's rollback (if it's because of a dupl row), better warn.
*/
const
char
*
save_proc_info
=
thd
->
proc_info
;
thd
->
proc_info
=
"Rolling back"
;
#ifdef HAVE_NDBCLUSTER_DB
if
(
trans
->
ndb_tid
)
{
...
...
@@ -654,6 +660,7 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
thd
->
variables
.
tx_isolation
=
thd
->
session_tx_isolation
;
if
(
operation_done
)
statistic_increment
(
ha_rollback_count
,
&
LOCK_status
);
thd
->
proc_info
=
save_proc_info
;
}
#endif
/* USING_TRANSACTIONS */
DBUG_RETURN
(
error
);
...
...
@@ -766,6 +773,24 @@ int ha_savepoint(THD *thd, char *savepoint_name)
DBUG_RETURN
(
error
);
}
int
ha_start_consistent_snapshot
(
THD
*
thd
)
{
#ifdef HAVE_INNOBASE_DB
if
((
have_innodb
==
SHOW_OPTION_YES
)
&&
!
innobase_start_trx_and_assign_read_view
(
thd
))
return
0
;
#endif
/*
Same idea as when one wants to CREATE TABLE in one engine which does not
exist:
*/
push_warning
(
thd
,
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
ER_NO_CONS_READ_ENGINE
,
ER
(
ER_NO_CONS_READ_ENGINE
));
return
0
;
}
bool
ha_flush_logs
()
{
bool
result
=
0
;
...
...
sql/handler.h
View file @
600b965f
...
...
@@ -138,6 +138,8 @@
#define HA_CACHE_TBL_ASKTRANSACT 2
#define HA_CACHE_TBL_TRANSACT 4
/* Options of START TRANSACTION statement (and later of SET TRANSACTION stmt) */
#define MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT 1
enum
db_type
{
...
...
@@ -568,4 +570,4 @@ int ha_find_files(THD *thd,const char *db,const char *path,
const
char
*
wild
,
bool
dir
,
List
<
char
>*
files
);
int
ha_table_exists
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
);
TYPELIB
*
ha_known_exts
(
void
);
int
ha_start_consistent_snapshot
(
THD
*
thd
);
sql/lex.h
View file @
600b965f
...
...
@@ -114,6 +114,7 @@ static SYMBOL symbols[] = {
{
"COMMITTED"
,
SYM
(
COMMITTED_SYM
)},
{
"COMPRESSED"
,
SYM
(
COMPRESSED_SYM
)},
{
"CONCURRENT"
,
SYM
(
CONCURRENT
)},
{
"CONSISTENT"
,
SYM
(
CONSISTENT_SYM
)},
{
"CONSTRAINT"
,
SYM
(
CONSTRAINT
)},
{
"CONVERT"
,
SYM
(
CONVERT_SYM
)},
{
"CREATE"
,
SYM
(
CREATE
)},
...
...
@@ -382,6 +383,7 @@ static SYMBOL symbols[] = {
{
"SIGNED"
,
SYM
(
SIGNED_SYM
)},
{
"SIMPLE"
,
SYM
(
SIMPLE_SYM
)},
{
"SLAVE"
,
SYM
(
SLAVE
)},
{
"SNAPSHOT"
,
SYM
(
SNAPSHOT_SYM
)},
{
"SMALLINT"
,
SYM
(
SMALLINT
)},
{
"SOME"
,
SYM
(
ANY_SYM
)},
{
"SONAME"
,
SYM
(
UDF_SONAME_SYM
)},
...
...
sql/log_event.cc
View file @
600b965f
...
...
@@ -977,7 +977,8 @@ void Query_log_event::print(FILE* file, bool short_form, char* last_db)
int
Query_log_event
::
exec_event
(
struct
st_relay_log_info
*
rli
)
{
int
expected_error
,
actual_error
=
0
;
thd
->
db
=
(
char
*
)
rewrite_db
(
db
);
// thd->db_length is set later if needed
thd
->
db_length
=
db_len
;
thd
->
db
=
(
char
*
)
rewrite_db
(
db
,
&
thd
->
db_length
);
/*
InnoDB internally stores the master log position it has processed so far;
...
...
@@ -995,11 +996,6 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
if
(
db_ok
(
thd
->
db
,
replicate_do_db
,
replicate_ignore_db
))
{
thd
->
set_time
((
time_t
)
when
);
/*
We cannot use db_len from event to fill thd->db_length, because
rewrite_db() may have changed db.
*/
thd
->
db_length
=
thd
->
db
?
strlen
(
thd
->
db
)
:
0
;
thd
->
query_length
=
q_len
;
thd
->
query
=
(
char
*
)
query
;
VOID
(
pthread_mutex_lock
(
&
LOCK_thread_count
));
...
...
@@ -1057,7 +1053,7 @@ Default database: '%s'. Query: '%s'",
expected_error
,
actual_error
?
thd
->
net
.
last_error
:
"no error"
,
actual_error
,
print_slave_db_safe
(
db
),
query
);
print_slave_db_safe
(
thd
->
db
),
query
);
thd
->
query_error
=
1
;
}
/*
...
...
@@ -1078,7 +1074,7 @@ Default database: '%s'. Query: '%s'",
"Error '%s' on query. Default database: '%s'. Query: '%s'"
,
(
actual_error
?
thd
->
net
.
last_error
:
"unexpected success or fatal error"
),
print_slave_db_safe
(
db
),
query
);
print_slave_db_safe
(
thd
->
db
),
query
);
thd
->
query_error
=
1
;
}
}
/* End of if (db_ok(... */
...
...
@@ -1706,7 +1702,8 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
bool
use_rli_only_for_errors
)
{
char
*
load_data_query
=
0
;
thd
->
db
=
(
char
*
)
rewrite_db
(
db
);
// thd->db_length is set later if needed
thd
->
db_length
=
db_len
;
thd
->
db
=
(
char
*
)
rewrite_db
(
db
,
&
thd
->
db_length
);
DBUG_ASSERT
(
thd
->
query
==
0
);
thd
->
query_length
=
0
;
// Should not be needed
thd
->
query_error
=
0
;
...
...
@@ -1741,7 +1738,6 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
if
(
db_ok
(
thd
->
db
,
replicate_do_db
,
replicate_ignore_db
))
{
thd
->
set_time
((
time_t
)
when
);
thd
->
db_length
=
thd
->
db
?
strlen
(
thd
->
db
)
:
0
;
VOID
(
pthread_mutex_lock
(
&
LOCK_thread_count
));
thd
->
query_id
=
query_id
++
;
VOID
(
pthread_mutex_unlock
(
&
LOCK_thread_count
));
...
...
@@ -1847,7 +1843,7 @@ Slave: load data infile on table '%s' at log position %s in log \
(
char
*
)
table_name
,
llstr
(
log_pos
,
llbuff
),
RPL_LOG_NAME
,
(
ulong
)
thd
->
cuted_fields
,
print_slave_db_safe
(
db
));
print_slave_db_safe
(
thd
->
db
));
}
if
(
net
)
net
->
pkt_nr
=
thd
->
net
.
pkt_nr
;
...
...
@@ -1865,6 +1861,7 @@ Slave: load data infile on table '%s' at log position %s in log \
}
thd
->
net
.
vio
=
0
;
char
*
save_db
=
thd
->
db
;
VOID
(
pthread_mutex_lock
(
&
LOCK_thread_count
));
thd
->
db
=
0
;
thd
->
query
=
0
;
...
...
@@ -1887,7 +1884,7 @@ Slave: load data infile on table '%s' at log position %s in log \
}
slave_print_error
(
rli
,
sql_errno
,
"\
Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'"
,
err
,
(
char
*
)
table_name
,
print_slave_db_safe
(
db
));
err
,
(
char
*
)
table_name
,
print_slave_db_safe
(
save_
db
));
free_root
(
thd
->
mem_root
,
MYF
(
MY_KEEP_PREALLOC
));
return
1
;
}
...
...
@@ -1897,7 +1894,7 @@ Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'",
{
slave_print_error
(
rli
,
ER_UNKNOWN_ERROR
,
"\
Fatal error running LOAD DATA INFILE on table '%s'. Default database: '%s'"
,
(
char
*
)
table_name
,
print_slave_db_safe
(
db
));
(
char
*
)
table_name
,
print_slave_db_safe
(
save_
db
));
return
1
;
}
...
...
sql/share/czech/errmsg.txt
View file @
600b965f
...
...
@@ -331,3 +331,4 @@ character-set=latin2
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/danish/errmsg.txt
View file @
600b965f
...
...
@@ -322,3 +322,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/dutch/errmsg.txt
View file @
600b965f
...
...
@@ -331,3 +331,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/english/errmsg.txt
View file @
600b965f
...
...
@@ -319,3 +319,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/estonian/errmsg.txt
View file @
600b965f
...
...
@@ -324,3 +324,4 @@ character-set=latin7
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/french/errmsg.txt
View file @
600b965f
...
...
@@ -319,3 +319,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/german/errmsg.txt
View file @
600b965f
...
...
@@ -332,3 +332,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/greek/errmsg.txt
View file @
600b965f
...
...
@@ -319,3 +319,4 @@ character-set=greek
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/hungarian/errmsg.txt
View file @
600b965f
...
...
@@ -324,3 +324,4 @@ character-set=latin2
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/italian/errmsg.txt
View file @
600b965f
...
...
@@ -319,3 +319,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/japanese/errmsg.txt
View file @
600b965f
...
...
@@ -323,3 +323,4 @@ character-set=ujis
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/korean/errmsg.txt
View file @
600b965f
...
...
@@ -319,3 +319,4 @@ character-set=euckr
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/norwegian-ny/errmsg.txt
View file @
600b965f
...
...
@@ -321,3 +321,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/norwegian/errmsg.txt
View file @
600b965f
...
...
@@ -321,3 +321,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/polish/errmsg.txt
View file @
600b965f
...
...
@@ -324,3 +324,4 @@ character-set=latin2
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/portuguese/errmsg.txt
View file @
600b965f
...
...
@@ -321,3 +321,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/romanian/errmsg.txt
View file @
600b965f
...
...
@@ -324,3 +324,4 @@ character-set=latin2
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/russian/errmsg.txt
View file @
600b965f
...
...
@@ -324,3 +324,4 @@ character-set=koi8r
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/serbian/errmsg.txt
View file @
600b965f
...
...
@@ -312,3 +312,4 @@ character-set=cp1250
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/slovak/errmsg.txt
View file @
600b965f
...
...
@@ -327,3 +327,4 @@ character-set=latin2
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/spanish/errmsg.txt
View file @
600b965f
...
...
@@ -323,3 +323,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/swedish/errmsg.txt
View file @
600b965f
...
...
@@ -319,3 +319,4 @@ character-set=latin1
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/share/ukrainian/errmsg.txt
View file @
600b965f
...
...
@@ -325,3 +325,4 @@ character-set=koi8u
"Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s%s' and '%s%s'"
"This MySQL server does not support any consistent-read capable storage engine"
sql/slave.cc
View file @
600b965f
...
...
@@ -1032,7 +1032,7 @@ bool net_request_file(NET* net, const char* fname)
}
const
char
*
rewrite_db
(
const
char
*
db
)
const
char
*
rewrite_db
(
const
char
*
db
,
uint
*
new_len
)
{
if
(
replicate_rewrite_db
.
is_empty
()
||
!
db
)
return
db
;
...
...
@@ -1042,8 +1042,11 @@ const char *rewrite_db(const char* db)
while
((
tmp
=
it
++
))
{
if
(
!
strcmp
(
tmp
->
key
,
db
))
{
*
new_len
=
strlen
(
tmp
->
val
);
return
tmp
->
val
;
}
}
return
db
;
}
...
...
@@ -1056,7 +1059,7 @@ const char *rewrite_db(const char* db)
const
char
*
print_slave_db_safe
(
const
char
*
db
)
{
return
(
db
?
rewrite_db
(
db
)
:
""
);
return
(
db
?
db
:
""
);
}
/*
...
...
sql/slave.h
View file @
600b965f
...
...
@@ -510,8 +510,8 @@ int add_table_rule(HASH* h, const char* table_spec);
int
add_wild_table_rule
(
DYNAMIC_ARRAY
*
a
,
const
char
*
table_spec
);
void
init_table_rule_hash
(
HASH
*
h
,
bool
*
h_inited
);
void
init_table_rule_array
(
DYNAMIC_ARRAY
*
a
,
bool
*
a_inited
);
const
char
*
rewrite_db
(
const
char
*
db
);
const
char
*
print_slave_db_safe
(
const
char
*
db
);
const
char
*
rewrite_db
(
const
char
*
db
,
uint
*
new_db_len
);
const
char
*
print_slave_db_safe
(
const
char
*
db
);
int
check_expected_error
(
THD
*
thd
,
RELAY_LOG_INFO
*
rli
,
int
error_code
);
void
skip_load_data_infile
(
NET
*
net
);
void
slave_print_error
(
RELAY_LOG_INFO
*
rli
,
int
err_code
,
const
char
*
msg
,
...);
...
...
sql/sql_lex.h
View file @
600b965f
...
...
@@ -613,7 +613,7 @@ typedef struct st_lex
uint
uint_geom_type
;
uint
grant
,
grant_tot_col
,
which_columns
;
uint
fk_delete_opt
,
fk_update_opt
,
fk_match_option
;
uint
slave_thd_opt
;
uint
slave_thd_opt
,
start_transaction_opt
;
uint8
describe
;
bool
drop_if_exists
,
drop_temporary
,
local_file
,
one_shot_set
;
bool
in_comment
,
ignore_space
,
verbose
,
no_write_to_binlog
;
...
...
sql/sql_parse.cc
View file @
600b965f
...
...
@@ -3076,6 +3076,12 @@ purposes internal to the MySQL server", MYF(0));
}
case
SQLCOM_UNLOCK_TABLES
:
/*
It is critical for mysqldump --single-transaction --master-data that
UNLOCK TABLES does not implicitely commit a connection which has only
done FLUSH TABLES WITH READ LOCK + BEGIN. If this assumption becomes
false, mysqldump will not work.
*/
unlock_locked_tables
(
thd
);
if
(
thd
->
options
&
OPTION_TABLE_LOCK
)
{
...
...
@@ -3462,6 +3468,8 @@ purposes internal to the MySQL server", MYF(0));
thd
->
options
=
((
thd
->
options
&
(
ulong
)
~
(
OPTION_STATUS_NO_TRANS_UPDATE
))
|
OPTION_BEGIN
);
thd
->
server_status
|=
SERVER_STATUS_IN_TRANS
;
if
(
!
(
lex
->
start_transaction_opt
&
MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT
)
||
!
(
res
=
ha_start_consistent_snapshot
(
thd
)))
send_ok
(
thd
);
}
break
;
...
...
sql/sql_yacc.yy
View file @
600b965f
...
...
@@ -131,6 +131,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token CLIENT_SYM
%token COMMENT_SYM
%token COMMIT_SYM
%token CONSISTENT_SYM
%token COUNT_SYM
%token CREATE
%token CROSS
...
...
@@ -165,6 +166,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token SELECT_SYM
%token SHOW
%token SLAVE
%token SNAPSHOT_SYM
%token SQL_THREAD
%token START_SYM
%token STD_SYM
...
...
@@ -618,6 +620,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
table_option opt_if_not_exists opt_no_write_to_binlog opt_var_type
opt_var_ident_type delete_option opt_temporary all_or_any opt_distinct
opt_ignore_leaves fulltext_options spatial_type union_option
start_transaction_opts
%type <ulong_num>
ULONG_NUM raid_types merge_insert_types
...
...
@@ -2095,10 +2098,20 @@ slave:
start:
START_SYM TRANSACTION_SYM { Lex->sql_command = SQLCOM_BEGIN;}
{}
START_SYM TRANSACTION_SYM start_transaction_opts
{
Lex->sql_command = SQLCOM_BEGIN;
Lex->start_transaction_opt= $3;
}
;
start_transaction_opts:
/*empty*/ { $$ = 0; }
| WITH CONSISTENT_SYM SNAPSHOT_SYM
{
$$= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT;
}
slave_thread_opts:
{ Lex->slave_thd_opt= 0; }
slave_thread_opt_list
...
...
@@ -5122,6 +5135,7 @@ keyword:
| COMMIT_SYM {}
| COMPRESSED_SYM {}
| CONCURRENT {}
| CONSISTENT_SYM {}
| CUBE_SYM {}
| DATA_SYM {}
| DATETIME {}
...
...
@@ -5262,6 +5276,7 @@ keyword:
| SHARE_SYM {}
| SHUTDOWN {}
| SLAVE {}
| SNAPSHOT_SYM {}
| SOUNDS_SYM {}
| SQL_CACHE_SYM {}
| SQL_BUFFER_RESULT {}
...
...
@@ -5888,7 +5903,7 @@ grant_option:
;
begin:
BEGIN_SYM { Lex->sql_command = SQLCOM_BEGIN;} opt_work {}
BEGIN_SYM { Lex->sql_command = SQLCOM_BEGIN;
Lex->start_transaction_opt= 0;
} opt_work {}
;
opt_work:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment