My Project
|
#include <log_event.h>
Public Member Functions | |
void | print_query_header (IO_CACHE *file, PRINT_EVENT_INFO *print_event_info) |
void | print (FILE *file, PRINT_EVENT_INFO *print_event_info) |
Query_log_event () | |
Query_log_event (const char *buf, uint event_len, const Format_description_log_event *description_event, Log_event_type event_type) | |
Log_event_type | get_type_code () |
bool | is_valid () const |
virtual ulong | get_post_header_size_for_derived () |
bool | is_trans_keyword () |
bool | starts_group () |
virtual bool | ends_group () |
Public Attributes | |
const char * | query |
const char * | catalog |
const char * | db |
uint32 | q_len |
uint32 | db_len |
uint16 | error_code |
ulong | thread_id |
ulong | slave_proxy_id |
uint | catalog_len |
uint16 | status_vars_len |
bool | flags2_inited |
bool | sql_mode_inited |
bool | charset_inited |
uint32 | flags2 |
sql_mode_t | sql_mode |
ulong | auto_increment_increment |
ulong | auto_increment_offset |
char | charset [6] |
uint | time_zone_len |
const char * | time_zone_str |
uint | lc_time_names_number |
uint | charset_database_number |
ulonglong | table_map_for_update |
uint32 | master_data_written |
uchar | mts_accessed_dbs |
char | mts_accessed_db_names [MAX_DBS_IN_EVENT_MTS][NAME_LEN] |
Protected Attributes | |
Log_event::Byte * | data_buf |
A Query_log_event
is created for each query that modifies the database, unless the query is logged row-based.
See Binary format for log events for a general discussion and introduction to the binary format of binlog events.
The Post-Header has five components:
Name | Format | Description |
---|---|---|
slave_proxy_id | 4 byte unsigned integer | An integer identifying the client thread that issued the query. The id is unique per server. (Note, however, that two threads on different servers may have the same slave_proxy_id.) This is used when a client thread creates a temporary table local to the client. The slave_proxy_id is used to distinguish temporary tables that belong to different clients. |
exec_time | 4 byte unsigned integer | The time from when the query started to when it was logged in the binlog, in seconds. |
db_len | 1 byte integer | The length of the name of the currently selected database. |
error_code | 2 byte unsigned integer | Error code generated by the master. If the master fails, the slave will fail with the same error code, except for the error codes ER_DB_CREATE_EXISTS == 1007 and ER_DB_DROP_EXISTS == 1008. |
status_vars_len | 2 byte unsigned integer | The length of the status_vars block of the Body, in bytes. See below. |
The Body has the following components:
Name | Format | Description |
---|---|---|
status_vars | status_vars_len bytes | Zero or more status variables. Each status variable consists of one byte identifying the variable stored, followed by the value of the variable. The possible variables are listed separately in the table below. MySQL always writes events in the order defined below; however, it is capable of reading them in any order. |
db | db_len+1 | The currently selected database, as a null-terminated string. (The trailing zero is redundant since the length is already known; it is db_len from Post-Header.) |
query | variable length string without trailing zero, extending to the end of the event (determined by the length field of the Common-Header) | The SQL query. |
The following table lists the status variables that may appear in the status_vars field.
Status variable | 1 byte identifier | Format | Description |
---|---|---|---|
flags2 | Q_FLAGS2_CODE == 0 | 4 byte bitfield | The flags in These flags correspond to the SQL variables SQL_AUTO_IS_NULL, FOREIGN_KEY_CHECKS, UNIQUE_CHECKS, and AUTOCOMMIT, documented in the "SET Syntax" section of the MySQL Manual. This field is always written to the binlog in version >= 5.0, and never written in version < 5.0. |
sql_mode | Q_SQL_MODE_CODE == 1 | 8 byte bitfield | The MODE_REAL_AS_FLOAT==0x1 MODE_PIPES_AS_CONCAT==0x2 MODE_ANSI_QUOTES==0x4 MODE_IGNORE_SPACE==0x8 MODE_NOT_USED==0x10 MODE_ONLY_FULL_GROUP_BY==0x20 MODE_NO_UNSIGNED_SUBTRACTION==0x40 MODE_NO_DIR_IN_CREATE==0x80 MODE_POSTGRESQL==0x100 MODE_ORACLE==0x200 MODE_MSSQL==0x400 MODE_DB2==0x800 MODE_MAXDB==0x1000 MODE_NO_KEY_OPTIONS==0x2000 MODE_NO_TABLE_OPTIONS==0x4000 MODE_NO_FIELD_OPTIONS==0x8000 MODE_MYSQL323==0x10000 MODE_MYSQL323==0x20000 MODE_MYSQL40==0x40000 MODE_ANSI==0x80000 MODE_NO_AUTO_VALUE_ON_ZERO==0x100000 MODE_NO_BACKSLASH_ESCAPES==0x200000 MODE_STRICT_TRANS_TABLES==0x400000 MODE_STRICT_ALL_TABLES==0x800000 MODE_NO_ZERO_IN_DATE==0x1000000 MODE_NO_ZERO_DATE==0x2000000 MODE_INVALID_DATES==0x4000000 MODE_ERROR_FOR_DIVISION_BY_ZERO==0x8000000 MODE_TRADITIONAL==0x10000000 MODE_NO_AUTO_CREATE_USER==0x20000000 MODE_HIGH_NOT_PRECEDENCE==0x40000000 MODE_PAD_CHAR_TO_FULL_LENGTH==0x80000000 All these flags are replicated from the server. However, all flags except This field is always written to the binlog. |
catalog | Q_CATALOG_NZ_CODE == 6 | Variable-length string: the length in bytes (1 byte) followed by the characters (at most 255 bytes) | Stores the client's current catalog. Every database belongs to a catalog, the same way that every table belongs to a database. Currently, there is only one catalog, "std". This field is written if the length of the catalog is > 0; otherwise it is not written. |
auto_increment | Q_AUTO_INCREMENT == 3 | two 2 byte unsigned integers, totally 2+2=4 bytes | The two variables auto_increment_increment and auto_increment_offset, in that order. For more information, see "System variables" in the MySQL manual. This field is written if auto_increment > 1. Otherwise, it is not written. |
charset | Q_CHARSET_CODE == 4 | three 2 byte unsigned integers, totally 2+2+2=6 bytes | The three variables character_set_client, collation_connection, and collation_server, in that order. character_set_client is a code identifying the character set and collation used by the client to encode the query. collation_connection identifies the character set and collation that the master converts the query to when it receives it; this is useful when comparing literal strings. collation_server is the default character set and collation used when a new database is created. See also "Connection Character Sets and Collations" in the MySQL 5.1 manual. All three variables are codes identifying a (character set, collation) pair. To see which codes map to which pairs, run the query "SELECT id, character_set_name, collation_name FROM COLLATIONS". Cf. Q_CHARSET_DATABASE_CODE below. This field is always written. |
time_zone | Q_TIME_ZONE_CODE == 5 | Variable-length string: the length in bytes (1 byte) followed by the characters (at most 255 bytes). | The time_zone of the master. See also "System Variables" and "MySQL Server Time Zone Support" in the MySQL manual. This field is written if the length of the time zone string is > 0; otherwise, it is not written. |
lc_time_names_number | Q_LC_TIME_NAMES_CODE == 7 | 2 byte integer | A code identifying a table of month and day names. The mapping from codes to languages is defined in This field is written if it is not 0, i.e., if the locale is not en_US. |
charset_database_number | Q_CHARSET_DATABASE_CODE == 8 | 2 byte integer | The value of the collation_database system variable (in the source code stored in collation_database was used in old versions (???WHEN). Its value was loaded when issuing a "use db" query and could be changed by issuing a "SET collation_database=xxx" query. It used to affect the "LOAD DATA INFILE" and "CREATE TABLE" commands. In newer versions, "CREATE TABLE" has been changed to take the character set from the database of the created table, rather than the character set of the current database. This makes a difference when creating a table in another database than the current one. "LOAD DATA INFILE" has not yet changed to do this, but there are plans to eventually do it, and to make collation_database read-only. This field is written if it is not 0. |
table_map_for_update | Q_TABLE_MAP_FOR_UPDATE_CODE == 9 | 8 byte integer | The value of the table map that is to be updated by the multi-table update query statement. Every bit of this variable represents a table, and is set to 1 if the corresponding table is to be updated by this statement. The value of this variable is set when executing a multi-table update statement and used by slave to apply filter rules without opening all the tables on slave. This is required because some tables may not exist on slave because of the filter rules. |
Status vars were introduced in version 5.0. To read earlier versions correctly, check the length of the Post-Header.
The status variable Q_CATALOG_CODE == 2 existed in MySQL 5.0.x, where 0<=x<=3. It was identical to Q_CATALOG_CODE, except that the string had a trailing '\0'. The '\0' was removed in 5.0.4 since it was redundant (the string length is stored before the string). The Q_CATALOG_CODE will never be written by a new master, but can still be understood by a new slave.
See Q_CHARSET_DATABASE_CODE in the table above.
When adding new status vars, please don't forget to update the MAX_SIZE_LOG_EVENT_STATUS, and update function code_name
The simplest constructor that could possibly work. This is used for creating static objects that have a special meaning and are invisible to the log.
Query_log_event::Query_log_event | ( | const char * | buf, |
uint | event_len, | ||
const Format_description_log_event * | description_event, | ||
Log_event_type | event_type | ||
) |
This is used by the SQL slave thread to prepare the event before execution.
Layout for the data buffer is as follows +--------+-----------+------+------+---------+----+-------+ | catlog | time_zone | user | host | db name | \0 | Query | +--------+-----------+------+------+---------+----+-------+
To support the query cache we append the following buffer to the above +-------+----------------------------------------+-------+ |db len | uninitiatlized space of size of db len | FLAGS | +-------+----------------------------------------+-------+
The area of buffer starting from Query field all the way to the end belongs to the Query buffer and its structure is described in alloc_query() in sql_parse.cc
if time_zone_len or catalog_len are 0, then time_zone and catalog are uninitialized at this point. shouldn't they point to the zero-length null-terminated strings we allocated space for in the my_alloc call above? /sven
Append the db length at the end of the buffer. This will be used by Query_cache::send_result_to_client() in case the query cache is On.
bool Query_log_event::starts_group | ( | ) | [inline] |
Notice, DDL queries are logged without BEGIN/COMMIT parentheses and identification of such single-query group occures within logics of get_slave_worker()
.