MySQL复制(二)---二进制日志怎么干活的_MySQL

答案 bitsCN 由之前的文章可以了解到,二进制日志在复制中起到举足轻重的作用,所以这一篇文章着重了解一下Mysql复制背后核心组件:二进制日志的庐山真面目。 二进制日志的结构 从概念上讲,二进制日志是一系列二进制日志事件。它包括一系列的binlog文件和一个binlog索引文件,当

126836

bitsCN

由之前的文章可以了解到,二进制日志在复制中起到举足轻重的作用,所以这一篇文章着重了解一下Mysql复制背后核心组件:二进制日志的庐山真面目。

二进制日志的结构 从概念上讲,二进制日志是一系列二进制日志事件。它包括一系列的binlog文件和一个binlog索引文件,当前服务器正在写入的binlog文件称之为active binlog。其文件名是通过配置文件中的log-bin和log-bin-index来定义的。

每个binlog文件是由若干binlog事件组成,以Format_description事件开始,以Rotate事件作为文件尾。

Format_description事件包含写binlog文件的服务器信息,以及关于文件状态的关键信息。如果服务器关闭或者重新启动,会创建一个新的binlog文件,同时写入新的Format_description事件,这个事件是必须的,因为服务器关闭和重启都会产生更新。服务器写完binlog文件后,在文件结尾添加一个Rotate事件,该事件包含下一个binlog文件的文件名及其开始读取的位置。除了Format_description和Rotate事件之外,binlog文件的其他事件都被分成 group进行管理。在事务存储引擎中,每个组大致对应一个事务,对于非事务存储引擎,每个语句本身就是一个组。通常情况下,每个组要么全部执行,要么去不执行。如果由于某种原因Slave在组执行的过程中停机,那么将从该组的起点而不是刚刚执行的语句开始复制。

binlog事件的结构 二进制日志版本4(binlog format 4)是在MySQL 5.0中引入,是专门为扩展而设计的。这里主要讨论二进制日志版本4。(MySQL 3.23 4.0 4.1版本都是使用二进制日志版本3)

每个binlog事件由三个部分组成:

通用头(common header):大小固定。事件的基本信息,其中重要的字段是事件类型和事件大小。 提交头(post header):大小固定。提交头与特定的事件类型相关 事件体(Event body):大小可变。事件体存储事件的主要数据,因事件类型不同而异。 具体看一下Format_description事件:

binlog文件格式版本 服务器版本字符串:一般包括三部分,即版本号、连字符和其他构建项。例如:5.1.42-debug-log 通用头的长度:存储了通用头的长度。这里是指Format_description事件,所以不同binlog文件该字段的值不同。除了Format_description和Rotate事件外,其他事件的通用头长度都是可变的。Format_description事件的通用头长度是不变的,是因为任何版本的服务器都需要读取这个事件。Rotate事件的通用头长度也是不变的,是因为Slave连接Master时首先要用到该事件。 提交头的长度:binlog文件中所有事件的提交头长度是不变的,该字段存储了各个事件的提交头长度构成的数组。由于不同服务器间的事件数目不同,所以这个字段前面还存储了服务器的事件数目。 通过事件来记录数据库变更 首先,由于二进制日志是公共资源,所有线程都向它写入语句,为了避免两个线程同时更新二进制日志,在写之前需要获得一个互斥锁Lock_log,写完之后再释放。

所有涉及到数据库更新的语句都会以Query事件的形式写入二进制日志中,除了实际执行的语句外,Query事件还包含执行语句必需的上下文附加信息。下面给出了如何记录这些上下文信息

当前数据库:在Query事件添加一个特殊字段记录当前数据库。 用户自定义变量的值:User_var事件记录单个用户自定义的变量的变量名及其值。 RAND函数的种子:Rand事件记录Rand函数所用的随机数种子。 当前时间:NOW,CURDATE,CURTIME,UNIX_TIMESTAMP和SYSDATE这五个函数会用到当前时间,针对这个事件会存储一个时间戳,表示事件何时开始执行。 AUTO_INCREMENT字段的插入值:Intvar事件记录在语句开始前,表内部的自动增量计数器的值。 调用LAST_INSERTED_ID的返回值:Intvar事件记录这个函数在语句的返回值。 线程ID:主要是涉及到临时表的处理。线程ID也是作为一个独立的字段存储在Query事件中。 * 对于SYSDATE函数,它返回的是函数执行时的时间,这一点不同于NOW函数,NOW返回的是语句执行的时间。所以SYSDATE对于复制来说是不安全的,尽量少用。

LOAD DATA INFILE语句 LOAD DATA INFILE比较特殊,它的上下文是文件系统的文件。要正确地传递和执行LOAD DATA INFILE语句,需要引入新的事件类型:

Begin_load_query:这个事件开始传输文件中的数据 Append_block:如果这个文件超过了连接的数据包大小所允许的最大值,那么跟随在Begin_load_query事件后面的一个或多个Append_block事件的系列包含着这个文件的剩余部分 Execute_load_query:Query事件的特殊变种,它包含了在Master上执行的LOAD DATA INFILE语句 对Master上执行的每个LOAD DATA INFILE语句而言,被读取的文件被映射到一个支持内部文件的缓冲区,并在接下来的处理流程中使用。此外,一个唯一的文件ID被分配给该执行语句,并用于指向该语句读取的文件。

当语句在执行的时,该文件的内容被写入二进制日志,作为以Begin_load_query事件开头的事件序列,Begin_load_query事件表示新文件的开始,且这个事件序列后面紧跟着零个或多个Append_block事件。每个写入二进制的事件都不会超过包大小所允许的最大值,这个最大值由max-allowed_packet选项指定。

当整个文件读取到表中后,通过写Execute_load_query事件到二进制日志来终止语句的执行。这个事件包含了执行语句和分配给该执行语句的文件ID。请注意,这并非是用户写的原始语句,而是重新创建的。

* Mysql 5.0.3之前的版本使用的事件名有点不一样,依次为Load_log_event,Execute_log_event,Create_file_log_event

二进制日志过滤器 myf中有两个选项可用于过滤日志:binlog-do-db和binlog-ignore-db。这两个选项可以使用多次。

MySQL过滤事件的方式对于不熟悉的人来说可能有点奇怪。Mysql过滤是在语句级完成的,binlog-*-db使用当前数据库来决定是否应该过滤该语句,而不是由语句所影响的表所在的数据库决定的。对于下面的例子,使用binlog-ignore-db=bad筛选bad数据库,下例中一个都不会写入日志。

USE bad; INSERT INTO t1 VALUES (1),(2);USE bad; INSERT INTO good.t2 VALUES (1),(2);USE bad; UPDATE good.t1, ugly.t2 SET a = b; 至于为什么不是以语句所影响的表所在的数据库来决定,可以尝试分析一下。如果以这种逻辑,使用binlog-ignore-db=ugly筛选时,第三条语句到底要不要写入日志呢?

为了避免在执行可能被过滤的语句时发生错误,请不要编写那种表名,函数名或存储过程名前面加数据库名的语句,而是通过使用use来改变当前数据库。

还有一个需要说明的是,只要设置了binlog-do-db,过滤器会无视binlog-ignore-db的设置。

当然对于MySQL复制来说,本身不建议使用过滤器,因为日志是不完整的。

二进制日志和安全 一般来说,一个有REPLICATION SLAVE权限的用户拥有读取Master上发生的所有事件的权限,因此为了安全应该保护该账户不被损害。具体预防的措施有:

尽可能使从防火墙外无法登录该账户 记录所有试图登录到该账户的日志,并将日志放置在一个单独的安全服务器上 加密Master和Slave间所用的连接,例如MySQL的built-in SLL 敏感信息不要放入日志文件中,比如说密码 # 第二种做法不会把明文密码写入到日志中,更安全些UPDATE employee SET pass = PASSWORD('foobar')SET @pass = PASSWORD('foobar');UPDATE employee SET pass = @pass 触发器 为了在服务器上重放二进制日志,毫无问题的处理各种表的权限,有必要用SUPER权限的用户执行所有语句。但触发器没有被定义使用SUPER权限,所以重要的是以正确的用户作为触发器的定义者去重新创建触发器。CREATE TRIGGER提供了一个DEFINER子句,如果没有给语句指定DEFINER,该语句添加DEFINER子句后被写到二进制日志中,且使用当前用户作为其定义者。

master>SHOW BINLOG EVENTS FROM 92236 LIMIT 1/G******************** 1. row ******************** Log_name: master-bin.000038 Pos: 92236 Event_type: Query Server_id: 1 End_log_pos: 92491 Info: use `test`; CREATE DEFINER=`root`@`localhost` TRIGGER ... 调用触发器的语句被记录到二进制日志,但它没有连接到特定的触发器。相反,当Slave执行该语句时,它会自动执行受该语句影响的表相关联的所有触发器,这意味着可以在Master和Slave上有不同的触发器。

存储过程 存储过程的定义语句的处理和触发器是类似的,CREATE PROCETURE语句也有可选的子语句DEFINER,写入二进制日志的时候,会强制加上该子句的。调用过程和触发器不一样。

# 定义存储过程

delimiter $$

CREATE PROCEDURE employee_add(p_name CHAR(64), p_email CHAR(64), p_password CHAR(64))

MODIFIES SQL DATA

BEGIN

DECLARE pass CHAR(64);

set pass = PASSWORD(p_pass)

INSERT INTO employee(name, email, password) VALUES (p_name, p_email, pass);

END $$

delimiter ;

# 调用存储过程

master> CALL employee_add('chunk', 'chuck@example', 'abrakadabra');

master> SHOW BINLOG EVENTS FROM 104033/G

******************** 1. row ********************

Log_name: master-bin.000038

Pos: 104033

Event_type: Intvar

Server_id: 1

End_log_pos: 104061

Info: INSERT_ID=1

******************** 2. row ********************

Log_name: master-bin.000038

Pos: 104061

Event_type: Query

Server_id: 1

End_log_pos: 104416

Info: use `test`; INSERT INTO employee(name, email, password) VALUES(

NAME_CONST('p_name',_latin1'chuck' COLLATE 'latin1_swedish_ci'),

NAME_CONST('p_email',_latin1'chuck@example' COLLATE 'latin1_swedish_ci'),

NAME_CONST('pass',_latin1'*FEB778934FDSFQOPL7...' COLLATE 'latin1_swedish_ci'))

有四点需要注意:

CALL语句没有被写入二进制日志。取而代之的是,执行语句作为调用的结果被写入二进制日志。

该语句改写为不包含任何对存储过程的参数的引用。取而代之的是,使用NAME_CONST函数为每个参数创建一个单值的结果集

局部声明的变量pass也被换成了NAME_CONST表达式

调用语句写入二进制日志之前,上下文信息已经写入日志,这里指Intvar事件

存储函数 存储过程的定义语句的处理和触发器是类似的,CREATE FUNCTION语句也有可选的子语句DEFINER,写入二进制日志的时候,会强制加上该子句的。调用的时候,存储函数以与触发器相同的方式被复制。有一点需要注意的就是,SELECT语句不会被写入二进制日志,但是一个含有存储函数的SELECT语句是个例外。

对于存储函数还有一个需要提到的是权限问题。CREATE ROUTINE权限是定义一个存储过程或存储函数所必需的。严格说创建一个存储程序不需要其他权限,但它通常根据定义者的权限执行。在Slave上的复制线程在不进行权限检查的情况下执行,这留下了严重的安全漏洞。MySQL 5.0之前的版本没有存储程序,这样不会有问题,因为在Master上违规的语句不会写到二进制日志中。由于存储过程被展开了,只有在Master上成功执行的语句才会写进二进制日志,所以也不会有问题。而存储函数有点不同,它并没有被展开,也就是说有可能在Master和Slave上执行不同的程序分支,带来潜在安全漏洞。在存储函数定义时使用SQL SECURITY DEFINER而不是SQL SECURITY INVOKER可以防止这一点。因为这一点的考虑,MySQL默认要求SUPER权限来定义存储函数。

Events 定义跟其他存储程序一样,也会有DEFINER子句。由于事件由事件调度器调用,因此它们总是以定义者执行从而不会存在存储函数的安全漏洞。当事件被执行时,该语句被直接写入二进制日志。由于事件是在Master上执行的,他们在Slave上是自动禁止的。但有时候如果需要升级Slave,就需要允许在Slave上执行这些事件。

UPDATE mysql.events SET status = ENABLED WHERE status = SLAVESIDE_DISABLED; 特殊结构 尽管基于语句的复制通常是简单的,但一些特殊结构必须小心处理,才能很好的来保证Slave执行语句时的上下文跟Master上执行时是一样的。

LOAD_FILE函数 LOAD_FILE函数让你可以获取一个文件,由于在复制过程中,它不会被传输,所以需要改写。

INSERT INTO document(author, body) VALUES ('Fox', LOAD_FILR('index.html'));# 可以用LOAD DATA FILE改写LOAD DATA INFILE 'index.html' INTO TABLE document FIELDS TERMINATED BY '@*@' LINES TERMINATED BY '&%&' (author, body) SET author = 'FOX';# 还可以用用户定义变量改写SET @document = LOAD_FILE('index.html');INSERT INTO document(author, body) VALUES ('Fox', @document); 非事务性的变化和错误处理 如果有一个employee表是支持事务的InnoDB存储引擎(主键是mail),而跟踪employee修改的log表是不支持事务的MyISAM存储引擎。在其上定义两个触发器,一个在INSERT之前触发tr_insert_before,插入一条记录到log表,插入纪录的状态为FAIL;一个在INSERT之后触发tr_insert_after,更改刚才插入纪录的状态为OK。连续插入两条完全相同记录时,tr_insert_before被触发,tr_insert_after则不会被触发。虽然employee失败回滚了,但是log里面插入的数据却没办法回滚,这是个问题。执行后二进制日志文件内容如下。

master> SET @pass = PASSWORD('xyz');master> INSERT INTO employee (name, mail, password) VALUES ('hu', 'hu@fox', @pass);master> INSERT INTO employee (name, mail, password) VALUES ('hu', 'hu@fox', @pass);master> SHOW BINLOG EVENTS IN 'local-bin.000023'******************** 1. row ******************** Log_name: master-bin.000023 Pos: 1252 Event_type: Query Server_id: 1 End_log_pos: 1320 Info: use 'test'; BEGIN******************** 2. row ******************** Log_name: master-bin.000023 Pos: 1320 Event_type: Intvar Server_id: 1 End_log_pos: 1348 Info: LAST_INSERT_ID=1******************** 3. row ******************** Log_name: master-bin.000023 Pos: 1348 Event_type: User var Server_id: 1 End_log_pos: 1426 Info: @'pass'=_utf 0x432423jklfslagklr... COLLATE utf8_general_ci******************** 4. row ******************** Log_name: master-bin.000023 Pos: 1426 Event_type: Query Server_id: 1 End_log_pos: 1567 Info: use 'test'; INSERT INTO employee ...******************** 5. row ******************** Log_name: master-bin.000023 Pos: 1567 Event_type: Xid Server_id: 1 End_log_pos: 1594 Info: COMMIT /* xid=60 */******************** 6. row ******************** Log_name: master-bin.000023 Pos: 1594 Event_type: Query Server_id: 1 End_log_pos: 1662 Info: use 'test'; BEGIN******************** 7. row ******************** Log_name: master-bin.000023 Pos: 1662 Event_type: Intvar Server_id: 1 End_log_pos: 1690 Info: LAST_INSERT_ID=1******************** 8. row ******************** Log_name: master-bin.000023 Pos: 1690 Event_type: User var Server_id: 1 End_log_pos: 1768 Info: @'pass'=_utf 0x432423jklfslagklr... COLLATE utf8_general_ci******************** 9. row ******************** Log_name: master-bin.000023 Pos: 1768 Event_type: Query Server_id: 1 End_log_pos: 1909 Info: use 'test'; INSERT INTO employee ...******************** 10. row ******************** Log_name: master-bin.000023 Pos: 1909 Event_type: Query Server_id: 1 End_log_pos: 1980 Info: use 'test'; ROLLBACK

事务 由上面的二进制日志内容可以看到,执行事务的时候需要额外的处理。对于事务来说,为了使得每个事务的所有语句在一起,不是按照事务的开始顺序而是提交顺序记入二进制日志。为了确保每个事务都作为一个单元被写入二进制日志,服务器需要将在不同线程中执行的语句分开,保存在一个事务缓存中,在事务提交的时候缓存被清空,同时事务缓存的内容被复制到二进制日志中。

那如何记录非事务性的语句呢?有这么三条规则可以使用:

如果语句被标记成事务的,它将被写入事务缓存 如果语句没有被标记成事务性的,而且事务缓存中没有语句,该语句将被直接写入二进制日志 如果语句没有被标记成事务性的,但是事务缓存中已有语句,该语句被写入事务缓存 如果一个事务里面涉及到非事务性语句时候,确保影响非事务性表的语句在事务中首先被写入,此时根据规则2

在开发或测试环境在碰到mysql相关故障时,大多数朋友可能会通过论坛发帖,QQ群讨论方式来获取帮助。该方式是获取帮助的有效途径之一。然而如果在生产环境,在没有网络的环境下,这些方式就无助于问题的解决。无论何种数据库,从官方网站获取帮助是最直接最有效的方式。其次没有网络的环境下,我们可以通过MySQL客户端工具自带的帮助信息来解决问题。

1)MySQL官方手册

下载位置:dev.mysql/doc/

2)MySQL客户端工具自带的帮助

获取mysql有关的帮助信息,直接在mysql提示符下输入help即可获得有关在mysql客户端相关的帮助信息。

这个方式与Oracle SQL*plus下的help 是类似的。

mysql> help

For information about MySQL products and services, visit:

mysql/

For developer information, including the MySQL Reference Manual, visit:

dev.mysql/

To buy MySQL Enterprise support, training, or other products, visit:

shop.mysql/

List of all MySQL commands:

Note that all text commands must be first on line and end with ';'

? (\?) Synonym for `help'.

clear (\c) Clear the current input statement. --清除当前输入的语句

connect (\r) Reconnect to the server. Optional arguments are db and host. --重新连接,通常用于被剔除或异常断开后重新连接,SQL*plus下也有这样一个connect命令

delimiter (\d) Set statement delimiter. --设置命令终止符,缺省为;,比如我们可以设定为/来表示语句结束

edit (\e) Edit command with $EDITOR. --编辑缓冲区的上一条SQL语句到文件,缺省调用vi,文件会放在/tmp路径下

ego (\G) Send command to mysql server, display result vertically. --控制结果显示为垂直显示

exit (\q) Exit mysql. Same as quit. --退出mysql

go (\g) Send command to mysql server. --发送命令到mysql服务

help (\h) Display this help.

nopager (\n) Disable pager, print to stdout. --关闭页设置,打印到标准输出

notee (\t) Don't write into outfile. --关闭输出到文件

pager (\P) Set PAGER [to_pager]. Print the query results via PAGER. --设置pager方式,可以设置为调用more,less等等,主要是用于分页显示

print (\p) Print current command.

prompt (\R) Change your mysql prompt. --改变mysql的提示符

quit (\q) Quit mysql.

rehash (\#) Rebuild completion hash. --自动补齐相关对象名字

source (\.) Execute an SQL script file. Takes a file name as an argument. --执行脚本文件

status (\s) Get status information from the server. --获得状态信息

system (\!) Execute a system shell command. --执行系统命令

tee (\T) Set outfile [to_outfile]. Append everything into given outfile.--操作结果输出到文件

use (\u) Use another database. Takes database name as argument. --切换数据库

charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets. --设置字符集

warnings (\W) Show warnings after every statement. --打印警告信息

nowarning (\w) Don't show warnings after every statement.

--上面的所有命令,扩号内的为快捷操作,即只需要输入?\?+ 字母即可执行

For server side help, type 'help contents' --注意这里的描述help contents将获得服务器端的相关帮助信息

--演示部分,演示常用命令

--connect命令

mysql> connect chardb localhost;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Connection id: 5

Current database: chardb

--设置分页,在多余一个页面显示时会不停的翻滚,用该命令可以设置分页,设置为调用系统命令

mysql> pager more --设置为more方式

PAGER set to 'more'

mysql> select table_name,table_type,engine from information_schema.tables; --该查询会超出一屏显示后按空格键会自动翻滚到下一屏

mysql> pager tail -5; --设置输出尾部5行

PAGER set to 'tail -5'

mysql> select table_name,table_type,engine from information_schema.tables;

| setup_timers | BASE TABLE | PERFORMANCE_SCHEMA |

| threads | BASE TABLE | PERFORMANCE_SCHEMA |

| animals | BASE TABLE | InnoDB |

| shop | BASE TABLE | InnoDB |

+----------------------------------------------+-------------+--------------------+

92 rows in set (0.02 sec)

mysql> pager; --查看当前的pager设置

PAGER set to 'tail -5'

mysql> nopager; --切换到标准(缺省)pager方式

PAGER set to stdout

--tee命令,输出日志文件

mysql> tee /tmp/query.log --开启输出到文件,相当与SQL*plus下的spool

Logging to file '/tmp/query.log'

mysql> select table_name,table_type,engine from information_schema.tables;

+----------------------------------------------+-------------+--------------------+

| table_name | table_type | engine |

+----------------------------------------------+-------------+--------------------+

| CHARACTER_SETS | SYSTEM VIEW | MEMORY |

| COLLATIONS | SYSTEM VIEW | MEMORY |

.............

mysql> notee; --关闭输出到文件,相当于SQL*Plus下的spool off

Outfile disabled.

mysql> system tail /tmp/query.log --查看输出的日志文件

| setup_consumers | BASE TABLE | PERFORMANCE_SCHEMA |

| setup_instruments | BASE TABLE | PERFORMANCE_SCHEMA |

| setup_timers | BASE TABLE | PERFORMANCE_SCHEMA |

| threads | BASE TABLE | PERFORMANCE_SCHEMA |

| animals | BASE TABLE | InnoDB |

| shop | BASE TABLE | InnoDB |

+----------------------------------------------+-------------+--------------------+

92 rows in set (0.02 sec)

--改变mysql提示符

mysql> prompt SessionA>

PROMPT set to 'SessionA> '

--恢复到缺省提示符

SessionA> prompt;

Returning to default PROMPT of mysql>

--执行sql脚本文件

mysql> system more query.sql --注意,此时为当前目录

use chardb

select * from tb_isam;

mysql> source query.sql

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

+------+-------+

| id | value |

+------+-------+

| 1 | a |

| 2 | b |

| 3 | c |

| 4 | f |

+------+-------+

4 rows in set (0.00 sec)

--获取状态信息

mysql> status;

--------------

mysql Ver 14.14 Distrib 5.5.37, for Linux (x86_64) using readline 5.1

Connection id: 6

Current database: chardb

Current user: root@localhost

SSL: Not in use

Current pager: less

Using outfile: ''

Using delimiter: ;

Server version: 5.5.37-log MySQL Community Server (GPL)

Protocol version: 10

Connection: Localhost via UNIX socket

Server characterset: latin1

Db characterset: utf8

Client characterset: latin1

Conn. characterset: latin1

UNIX socket: /var/lib/mysql/mysql.sock

Uptime: 3 hours 10 min 59 sec

Threads: 1 Questions: 97 Slow queries: 0 Opens: 313 Flush tables: 1 Open tables: 51 Queries per second avg: 0.008

--------------

--修改客户端字符集

mysql> charset gbk;

Charset changed

mysql> \s

--------------

mysql Ver 14.14 Distrib 5.5.37, for Linux (x86_64) using readline 5.1

Connection id: 6

Current database: chardb

Current user: root@localhost

SSL: Not in use

Current pager: less

Using outfile: ''

Using delimiter: ;

Server version: 5.5.37-log MySQL Community Server (GPL)

Protocol version: 10

Connection: Localhost via UNIX socket

Server characterset: latin1

Db characterset: utf8

Client characterset: gbk ---客户端和conn端字符集都变成gbk了。

Conn. characterset: gbk

UNIX socket: /var/lib/mysql/mysql.sock

Uptime: 3 hours 13 min 33 sec

Threads: 1 Questions: 105 Slow queries: 0 Opens: 313 Flush tables: 1 Open tables: 51 Queries per second avg: 0.009

--------------

mysql> warnings;

Show warnings enabled.

mysql> selecs 1;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selecs 1' at line 1

mysql> show warnings;

+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Level | Code | Message |

+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Error | 1064 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selecs 1' at line 1 |

+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> show errors;

+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Level | Code | Message |

+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Error | 1064 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selecs 1' at line 1 |

+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> nowarning;

Show warnings disabled.

--获取服务器管理相关的帮助,输入help contents

mysql> help contents;

You asked for help about help category: "Contents"

For more information, type 'help ', whereis one of the following

categories:

Account Management

Administration

Compound Statements

Data Definition

Data Manipulation

Data Types

Functions

Functions and Modifiers for Use with GROUP BY

Geographic Features

Help Metadata

Language Structure

Plugins

Procedures

Storage Engines

Table Maintenance

Transactions

User-Defined Functions

Utility

--要查询那一个部分的内容,直接输入help + 内容,如下

mysql> help administration;

You asked for help about help category: "Administration"

For more information, type 'help ', whereis one of the following

topics:

BINLOG

CACHE INDEX

FLUSH

FLUSH QUERY CACHE

HELP COMMAND

KILL

..........

--接下来,我们查看administration部分下的flush命令用法,直接输入help flush;即可

mysql> help flush;

Name: 'FLUSH'

Description:

Syntax:

FLUSH [NO_WRITE_TO_BINLOG | LOCAL]

flush_option [, flush_option] ...

The FLUSH statement has sev

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

图片声明:本站部分配图来自人工智能系统AI生成,国外stocksnap摄影无版权图库。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国外贸事业出一份力,发布内容不收取任何费用也不接任何广告!
 

  • 热门焦点
  • 顺丰快递从上海到哈尔滨需要几天

    顺丰快递从上海寄到哈尔滨市区内,最快需要第3天到达收件,一般是不超过第4天上午。。。从上海到哈尔滨市有2270公里左右,已经是很远了,但现在的交通也很发达,快递也比较快。如果顺
    08-12
  • 京东快递跨省几天能到

    京东快递跨省一般1-3天的时间能到。在京东商城和京东自营买东西,一般采用京东快递配送。购买的商品一般是24小时内发货,一般到货时间是1-3天。如果是进驻商家,快递合作方由商家
    08-12
  • 正在通知快递取件一般要等多久

    正在通知快递取件一般要等2个小时左右,如果是约定取件,快递员会在约定的时间内上门取件。当商家发货后,快递公司会在1-2个工作日内到达商家所在地,并进行取件。然而,具体时间还要
    08-18
  • 怎样查询邮政的快递信息?

    进入到邮政官方,在邮件查询方式里选择手机号查询,输入手机号码和验证码,就可以查询了。操作方法如下:1、首先打开浏览器,输入邮政点击官网进入。2、进入之后点击邮件查询。3、在左侧的导航栏里继续点击邮件查询。4、然后选择手机号查询。5、输入手机号码并填写相关的信息后点
    09-24
  • 顺丰快递需要填写什么资料

    顺丰快递需要填写什么资料 顺丰快递需要填写寄件人地址,寄件人电话,收件人地址,收件人电话,物品名称,物品重量,物品体积,付款方式这些资料,以下是顺丰快递单据的填写方法: 1、填写寄件人资讯 首先要拿到一张顺丰空白快递单,填写寄件人资讯,公司名称可以根据实际情况可写可不写;联
    09-03
  • 为什么我的快递显示已签收却没有取件码?

    取件码是需要入库上架之后的,快递显示已经代收了,说明快递员已经把快递交给了代收点,比如说菜鸟驿站,但是菜鸟驿站还没来得及上架,所以没有取件码。快递又称速递或快运,是指物流
    08-18
  • 一对20公斤哑铃要邮走大概多少邮费哈尔滨到齐齐哈尔

    特快专递资费:20元/500克,每加量500克加收6元。共134元邮费。(包装费另算)快递包裹资费:与特快专递的资费约等于一半。(包装费另算)普通包裹资费:1.2元/1000克在加三元挂号费。(
    08-11
  • 菜鸟驿站不扫码出库有影响吗

    菜鸟驿站不扫码出库没有影响。菜鸟没有扫码出库直接拿走没有影响,系统会自动签收的。在购物时,如果时间上不方便接收快递,可以选择由菜鸟驿站代为签收,快递到达菜鸟驿站后,菜鸟驿
    08-18
  • 中铁单位有多少局?都分布在哪,子公司在哪

    1、中国铁路工程总公司:北京市西客站南广场中铁工程大厦;2、中铁一局集团有限公司:西安市雁塔北路1号;3、中铁二局集团有限公司:成都市马家花园路10号;4、中铁三局集团有限公司:太原市迎泽大街269号;5、中铁四局集团有限公司:合肥市望江东路96号;6、中铁五局集团有限公司:贵阳市枣山
    09-03
  • 中国邮编是多少, Zip code是什么啊?

    您好!中国的邮政编码是6位数,在世界任何一个地方往中国寄件都是填写6位邮编。Zip Code 是美国邮编的叫法从国外寄信件到中国大陆如何填写邮编?直接填写大陆地址对应的邮编即可
    08-12
  • 邮政快递营业时间表

    早上8点至下午6点。根据查询中国邮政官网显示,邮政快递营业时间是周一至周日早上8点至下午6点,节假日不休息。邮政快递主要经营国内速递、国际速递、合同物流等业务,是中国速递
    08-12
  • 韵达快递货物寄出后多长时间能查到物流信息

    一般情况下快递到店会进行录单,便可在官网上查询,此时提示“xxxx网点已揽件”包括发出时间、地点、货物状态都会详细记录的,单号查询可在韵达官网可查询详细的记录通常当天上午
    08-11
  • 国际邮寄包裹资费标准?

    国内邮件资费 (2004年1月1日起执行) 单位:元 编号 业务种类 计费单位 资费标准 本埠(县)资费 外埠资费 1 信函 首重100克内,每重20克 (不足20克按20克计算) 0.60 0.80 续重101-2000
    08-13
  • 有什么快递公司可以往国外寄东西?

    国际快递是指在全球提供门到门服务的公司,主要的公司有:①EMS : 国家邮局国际特快专递,由到达国的邮局派送。国内的如顺丰、韵达申通快递都是有开通部分国际业务。②四大国际巨
    08-12