暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MYSQL 第一章 概述和新特性

350

mysql 号称支持20万张表,和50亿行。支持每个表上64个索引,每个索引1到16个字段。InnoDB表的最大索引宽度是767字节,MyISAM是1000。索引可以使用CHAR,VARCHAR,BLOB或TEXT列类型的列的前缀




连接

客户端可以使用下列协议连接到mysql server:

-客户端可以在任何平台使用TCP/IP socket连接

-在Windows 系统中,如果服务器使用了--enable-named-pipe 启动,客户端可以使用 named pipes 连接。如果 使用了 --shared-memory 选项,Windows 服务器也支持 shared-memory 连接。客户端可以使用--protocol = memory选项通过共享内存进行连接

-在 Unix 系统,客户端可以使用Unix domain socket文件连接。


支持各种语言的API。让MYSQL 客户端可以以各种语言编写。



Localization

-服务器可以向多种语言的客户端提供错误消息


-完全支持几种不同的字符集,包括latin1(cp1252),german,big5,ujis,几个Unicode字符集等等。例如,斯堪的纳维亚字符“å”,“ä”和“ö”在表格和列名称中是允许的。


-所有数据都保存在所选的字符集中


-排序和比较根据所选的字符集和排序规则完成(默认情况下使用latin1和Swedish排序规则)。MySQL服务器启动时可以改变这个。要查看非常高级的排序示例,请查看捷克语排序代码。MySQL服务器支持许多不同的字符集,可以在编译时和运行时指定



-服务器时区可以动态更改,个别客户端可以指定自己的时区




客户端和工具:


-MySQL包括几个客户端和应用程序。这些包括命令行程序,如mysqldump和mysqladmin,以及图形程序,如MySQL Workbench。



-MySQL服务器内置了对SQL语句的支持来检查,优化和修复表。这些语句可以通过mysqlcheck客户端从命令行获得。MySQL也包含myisamchk,一个用于在MyISAM表上执行这些操作的非常快速的命令行工具


-MySQL 程序可以使用--help和-?选项来获得在线帮助




5.7版本的新特性

新增的特性:

1.安全改进

-现在,服务器需要mysql.user表中的帐户行具有非空的plugin列值,并禁用具有空值的帐户。有关服务器升级说明,参考 Section 2.11.1.1, “Changes Affecting Upgrades to MySQL 5.7”。建议DBA使用mysql_native_password认证插件的帐户,代替mysql_old_password,因为对mysql_old_password的支持已被删除。


-MySQL现在允许数据库管理员建立一个自动密码过期的策略:任何使用密码超过其允许的生命期的帐户连接到服务器的用户必须更改密码


-管理员可以锁定和解锁帐户,以更好地控制谁可以登录。


-为了便于支持安全连接,使用OpenSSL编译的MySQL服务器可以在启动时自动生成缺失的SSL和RSA证书和密钥文件


所有服务器(无论是使用OpenSSL还是yaSSL编译),如果未明确配置为SSL,则尝试在启动时自动启用SSL,前提是在数据目录中找到必需的SSL文件


另外,MySQL发行包含一个mysql_ssl_rsa_setup实用程序,可以手动调用创建SSL和RSA密钥和证书文件


-使用mysqld --initialize安装的MySQL部署默认是安全的。以下更改已作为默认部署特性实施:

安装过程只会创建一个root帐户“root”@“localhost”,自动为该帐户生成随机密码,并将密码过期。MySQL管理员必须使用随机密码以root身份进行连接并分配新密码。(服务器将随机密码写入错误日志。)


--安装不会创建匿名用户。不会创建test 数据库


2.SQL mode 变化

事务存储引擎的严格SQL模式(STRICT_TRANS_TABLES)现在默认启用。


ONLY_FULL_GROUP_BY SQL模式的实现已经变得更加复杂,不再拒绝先前被拒绝的确定性查询。因此,现在默认情况下启用这个模式,只禁止包含不能保证在一个组中唯一确定的表达式的非确定性查询


ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE 和 NO_ZERO_IN_DATE SQL 模式现在被废弃,但是默认是启用的。长期计划是将它们包含在严格的SQL模式中,并在未来的MySQL版本中将其作为显式模式移除


对默认SQL模式的更改将导致启用这些模式的默认sql_mode系统变量值:

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,

NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, 和

NO_ENGINE_SUBSTITUTION.



3.在线alter table

ALTER TABLE现在支持重命名索引的RENAME INDEX子句。在没有表复制操作的情况下进行更改。它适用于所有存储引擎


4.ngram and MeCab full-text 插件

从MySQL 5.7.6开始,MySQL提供了一个支持中文,日文和韩文的内置全文ngram解析器插件(CJK),以及一个可安装的MeCab全文解析器插件


5.InnoDB增强:

-VARCHAR 大小可以使用 ALTER TABLE 增加,例如:

ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);


只要VARCHAR列所需的长度字节数保持不变,就是如此。对于0到255的VARCHAR值,需要一个长度字节来对该值进行编码。对于256字节或更多的VARCHAR值,需要两个长度字节。因此,原位ALTER TABLE仅支持从0到255个字节增加VARCHAR大小,或者将VARCHAR大小从等于或大于256个字节的值



ALTER TABLE不支持将VARCHAR大小从小于256字节增加到等于或大于256字节的值。在这种情况下,所需的长度字节数将从1更改为2,这只能由表副本支持(ALGORITHM = COPY)。例如,尝试使用就地ALTER TABLE将VARCHAR列大小从255更改为256将返回一个错误:

ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);

ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change

column type INPLACE. Try ALGORITHM=COPY



不支持使用ALTER TABLE减少VARCHAR大小。减小VARCHAR大小需要一个表副本(ALGORITHM = COPY)


InnoDB临时表的DDL性能通过优化CREATE TABLE,DROP TABLE,TRUNCATE TABLE和ALTER TABLE语句来提升。



-InnoDB临时表元数据不再存储在InnoDB系统表中。相反,新表INNODB_TEMP_TABLE_INFO为用户提供了活动临时表的快照。该表包含所有用户和系统创建的在给定InnoDB实例中处于活动状态的临时表的元数据和报告。该表在第一个SELECT语句针对它运行时创建


-InnoDB现在支持MySQL支持的空间数据类型。在此版本之前,InnoDB会将空间数据存储为二进制BLOB数据。BLOB仍然是基础数据类型,但空间数据类型现在映射到新的InnoDB内部数据类型DATA_GEOMETRY。


-现在,所有未压缩的InnoDB临时表都有单独的表空间。新的表空间始终在服务器启动时重新创建,默认情况下位于DATADIR中。新添加的配置文件选项innodb_temp_data_file_path允许用户定义的临时数据文件路径。


-在MySQL 5.7.2中,innochecksum功能增强了几个新的选项和扩展功能


-正常和压缩的临时表和相关对象的一种新的非重做撤销日志现在驻留在临时表空间中



-在MySQL 5.7.2中,增强了InnoDB缓冲池转储和加载操作。一个新的系统变量innodb_buffer_pool_dump_pct允许您指定每个缓冲池中最近使用的页面的百分比来读出和转储。当InnoDB后台任务执行其他I O活动时,InnoDB会尝试使用innodb_io_capacity设置来限制每秒缓冲池加载操作的次数


-在MySQL 5.7.3中,InnoDB支持全文解析器插件


-从MySQL 5.7.4开始,InnoDB支持多个页面清理器线程来清除缓冲池实例中的脏页面。新的系统变量innodb_page_cleaners用于指定页面清理器线程的数量。默认值1维护的前置MySQL 5.7.4配置中有一个页面清理器线程。这个增强建立在MySQL5.6完成的工作上,MySQL5.6引入了一个单页面清理器线程来从InnoDB主线程卸载缓冲池刷新工作。



-从MySQL 5.7.4开始,MySQL支持使用在线DDL(ALGORITHM = INPLACE)为以下操作重建常规和分区的InnoDB表:

• OPTIMIZE TABLE

• ALTER TABLE ... FORCE

• ALTER TABLE ... ENGINE=INNODB (当在一个InnoDB 表上运行的时候)


在线DDL支持减少了表重建时间,并允许并发DML,这有助于减少用户应用程序的停机时间



-Linux上的Fusion-io非易失性内存(NVM)文件系统提供了原子写入功能,这使InnoDB双写缓冲区成为冗余。在MySQL 5.7.4中,对于位于支持原子写入的Fusion-io设备上的系统表空间文件(ibdata文件),InnoDB双写缓冲区被自动禁用。




-从MySQL 5.7.4开始,InnoDB支持可分区的InnoDB表和独立的InnoDB表分区的可传输表空间功能。此增强功能简化了分区表的备份过程,并且可以在MySQL实例之间复制分区表和单个表分区


-从MySQL 5.7.5开始,innodb_buffer_pool_size参数是动态的,允许您在不重新启动服务器的情况下调整缓冲池的大小。包括将页面移动到内存中的新位置的调整大小操作以块为单位执行。块大小可以使用新的innodb_buffer_pool_chunk_size配置选项进行配置。您可以使用新的Innodb_buffer_pool_resize_status状态变量来监视调整大小的进度


-多线程页面清理器支持(innodb_page_cleaners)被扩展到MySQL 5.7.5中的关闭和恢复阶段

-从MySQL 5.7.5开始,InnoDB支持使用SPATIAL索引对空间数据类型进行索引,包括使用ALTER TABLE ... ALGORITHM = INPLACE进行在线操作(ADD SPATIAL INDEX)


-从MySQL 5.7.5开始,InnoDB在创建或重建索引时执行批量加载。这种索引创建方法被称为“排序索引构建”。这种提高索引创建效率的增强功能也适用于全文索引。新的全局配置选项innodb_fill_factor定义了在排序的索引构建过程中填充数据的每个页面上的空间百分比,剩下的空间用于未来的索引增长。


-从MySQL 5.7.5开始,使用新的日志记录类型(MLOG_FILE_NAME)来标识自上一个检查点以来已被修改的表空间。此增强功能简化了崩溃恢复期间的表空间发现过程,并在重做日志应用程序之前消除了文件系统上的扫描

这个增强改变了重做日志格式,要求MySQL在升级到或者从MySQL 5.7.5降级之前干净地关闭。


-从MySQL 5.7.5开始,可以截断驻留在撤消表空间中的撤消日志。该功能是使用innodb_undo_log_truncate配置选项启用的



-从MySQL 5.7.6开始,InnoDB支持本地分区。以前,InnoDB依靠ha_partition处理程序,它为每个分区创建一个处理程序对象。通过本机分区,分区的InnoDB表使用单个分区感知的处理程序对象。此增强功能可减少分区的InnoDB表所需的内存量


从MySQL 5.7.9开始,mysql_upgrade查找并尝试升级使用ha_partition处理程序创建的分区的InnoDB表。同样在MySQL 5.7.9和更高版本中,您可以使用ALTER TABLE ...升级分区


从MySQL 5.7.6开始,InnoDB支持使用CREATE TABLESPACE语法创建常规表空间

CREATE TABLESPACE `tablespace_name`

ADD DATAFILE 'file_name.ibd'

[FILE_BLOCK_SIZE = n]


常规表空间可以在MySQL数据目录之外创建,能够保存多个表,并支持所有行格式的表


表添加到使用CREATE TABLE tbl_name... TABLESPACE[=] TABLESPACE_NAME或ALTER TABLE tbl_name TABLESPACE[=] tablespace_namesyntax一般表空间。



-在MySQL 5.7.9中,DYNAMIC将COMPACT替换为InnoDB表的隐式默认行格式。一个新的配置选项innodb_default_row_format指定了默认的InnoDB行格式。




6. JSON 支持

从MySQL 5.7.8开始,MySQL支持本机JSON类型。JSON值不作为字符串存储,而是使用内部二进制格式,允许快速读取文档元素。存储在JSON列中的JSON文档在插入或更新时会自动进行验证,并生成错误的无效文档。JSON文档在创建时被标准化,并且可以使用大多数比较运算符(比如=,<,<=,>,> =,<>,!=

和<=>;



7.系统和状态变量


系统和状态变量信息现在在性能方案表中可用,优先使用INFORMATION_SCHEMA表来获得这些变量。这也影响了SHOW VARIABLES和SHOW STATUS语句的操作。show_compatibility_56系统变量的值会影响系统和状态变量语句和表所需的输出以及所需的权限


注意:

show_compatibility_56的默认值为OFF。需要5.6行为的应用程序应将此变量设置为ON,直到它们已被迁移到系统变量和状态变量的新行为


sys方案:

MySQL发行版现在包含了sys模式,这是一组帮助的对象

DBA和开发人员解释性能模式收集的数据。sys架构对象可以用于典型的调优和诊断用例



条件处理

MySQL现在支持堆栈式诊断区域。按下诊断区域堆栈后,第一个(当前)诊断区域将成为第二个(堆叠)诊断区域,并将创建一个新的当前诊断区域作为其副本。在条件处理程序中,已执行的语句修改新的当前诊断区域,但GET STACKED DIAGNOSTICS可用于检查堆栈的诊断区域,以获取有关导致处理程序激活的条件的信息,而与处理程序本身内的当前条件无关。(以前有一个诊断区域,为了检查处理程序中的处理程序激活条件,必须在执行任何可能改变它的语句之前检查该诊断区域。)





8.优化器

些优化器增强功能被添加:

-EXPLAIN

可以用来获取在命名连接中执行的可解释语句的执行计划:

EXPLAIN [options] FOR CONNECTION connection_id;


-可以在单独的SQL语句中向优化器提供提示,这可以比使用optimizer_switch系统变量可以实现对语句执行计划的更好的控制。与EXPLAIN一起使用的语句也允许提示,使您能够看到hints如何影响执行计划



9. 触发器

以前,对于触发事件(INSERT,UPDATE,DELETE)和动作时间(BEFORE,AFTER)的每个组合,最多只能有一个触发器。此限制已解除,并允许多个触发器



10.Logging 这些日志增强功能被添加:

以前,在Unix和类Unix系统上,MySQL支持将服务器错误日志发送到系统日志是通过将mysqld_safe捕获服务器错误输出并将其传递给syslog来实现的。服务器现在包括本机系统日志支持,已经扩展到包括Windows。


mysql客户端现在有一个--syslog选项,可以将交互式语句发送到系统日志工具。对匹配缺省“忽略”模式列表(“* IDENTIFIED *:* PASSWORD *”)的语句以及与使用--histignore选项指定的任何模式匹配的语句


11.生成字段

MySQL现在支持在CREATE TABLE和ALTER TABLE语句中生成列的规范。生成列的值是根据列创建时指定的表达式计算的。生成的列可以是虚拟的(在读取行时“即时”计算)或存储(当插入或更新行时计算)


12.mysql 客户端

以前,mysql中的Control + C中断了当前的语句,如果没有,还是退出mysql。现在,Control + C中断当前语句,如果有的话,或者取消任何部分输入行,否则不会退出



13.数据库名称用mysqlbinlog重写

现在,使用MySQL 5.7.1中添加的--rewrite-db选项支持从使用基于行的格式写入的二进制日志读取时通过mysqlbinlog重命名数据库。

此选项使用格式--rewrite-db ='dboldname-> dbnewname'。您可以通过多次指定选项来实现多个重写规则。



14. 分区表的HANDLER

HANDLER语句现在可以与用户分区表一起使用。这样的表可以使用任何可用的分区类型



15.对分区表的索引条件下推支持。

在MySQL 5.7.3和更高版本中,使用InnoDB或MyISAM存储引擎对分区表进行的查询可能会使用MySQL 5.6中引入的索引条件下的优化器pushdown


16. ALTER TABLE ... EXCHANGE PARTITION 支持 WITHOUT VALIDATION


从MySQL 5.7.5开始,ALTER TABLE ... EXCHANGE PARTITION语法包含一个可选的{WITH | WITHOUT} VALIDATION子句。指定WITHOUT VALIDATION时,ALTER TABLE ... EXCHANGE PARTITION在与分区交换填充表时不执行逐行验证,允许数据库管理员承担确保行位于分区定义边界内的责任。WITH VALIDATION是默认行为,不需要明确指定

--这个和oracle 好像


17.Master dump 线程改进

主转储线程被重构以减少锁争用并提高主吞吐量。在MySQL 5.7.2之前,每当读取一个事件时,转储线程都会对二进制日志进行锁定; 在MySQL 5.7.2和更高版本中,只有在读取上次成功写入事件结束时的位置时才锁定该锁。这意味着多个转储线程现在可以同时从二进制日志文件读取,并且转储线程现在能够在客户端写入二进制日志时读取。


18.Globalization 改进

MySQL 5.7.4包含一个gb18030字符集,支持中国国家标准GB18030字符集



19.不用 STOP SLAVE 变更复制主机

在 MySQL 5.7.4 之后,在 发布任何CHANGE MASTER TO 语句期间,严格先执行 STOP SLAVE的需求被移除。代替依赖slave是否被关闭,CHANGE MASTER TO 现在取决于slave SQL线程和slave I/O线程的状态;现在停止或运行的线程中决定了在给定的时间点上可以使用或不能使用 CHANGE MASTER TO 语句。作出此决定的规则列于此处:

-如果 SQL 线程已停止,你可以执行 CHANGE MASTER TO 使用RELAY_LOG_FILE, RELAY_LOG_POS 和 MASTER_DELAY选项的任何组合,即使 slave I/O线程在运行。当I/O线程运行时,没有其他选项可用于此语句。

- 如果 I/O 线程已停止。你可以执行 CHANGE MASTER TO 使用语句的任何选项(任何组合) 除了RELAY_LOG_FILE, RELAY_LOG_POS 或MASTER_DELAY,即使 SQL 线程正在运行。这3个选项不允许当I/O 线程运行时使用。

- 在执行 CHANGE MASTER TO ... MASTER_AUTO_POSITION = 1 之前,SQL线程和I/O 线程必须停止。


你可以使用 SHOW SLAVE STATUS 来检查当前 slave SQL 和I/O 线程的状态。

如果您使用基于语句的复制和临时表,可以为CHANGE MASTER TO 语句跟随一个 STOP SLAVE 语句 来把临时表放在slave 上。


20.测试套件

MySQL test 套件目前使用InnoDB 作为默认存储引擎



21.多源复制现在是可能的

Mysql 多源复制增加了从多个主机复制到slave的能力。可以用来备份多个服务器到单一服务器,合并表shards 和将数据从多个服务器合并到单个服务器。


作为MYSQL 多源复制的一部分。复制通道被增加。复制通道让salve能打开多个链接到复制from,每个通道链接到一个master。


22.组复制性能模式表

MYSQL 5.7 增加了一些新的表到性能方案中,来提供关于复制组和通道的信息。这包含下列表:

-replication_applier_configuration

-replication_applier_status

-replication_applier_status_by_coordinator

-replication_applier_status_by_worker

-replication_connection_configuration

-replication_connection_status

-replication_group_members

-replication_group_member_stats


这些表除了replication_group_members 和replication_group_member_stats 是在5.7.6 增加的,其他的表都在5.7.2增加。


23.组复制SQL

下列语句在5.7.6中被增加来控制组复制:

• START GROUP_REPLICATION

• STOP GROUP_REPLICATION



过期特性(Deprecated)

下列特性将在 MySQL5.7 被启用,可能或将要在之后版本移除。

在显示替代方案的地方,应用程序应该更新以使用它们



1.ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, 和 NO_ZERO_IN_DATE SQL 模式现在被过期,但是默认是启用的。长期计划是将它们包含在严格的SQL模式中,并在未来的MySQL版本中将其作为显式模式移除

不推荐使用的ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE SQL模式仍然被识别,以便命名这些模式的语句不会产生错误,但会在将来的MySQL版本中被删除。为了对这些模式名称不存在的MySQL版本进行预先准备,应该修改应用程序以便不引用它们。



2.帐户管理语句的更改使以下功能过时。他们现在被弃用:

使用GRANT创建用户。相反,使用CREATE USER。遵循这种做法,NO_AUTO_CREATE_USER SQL模式对于GRANT语句来说是不重要的,所以它也被弃用


使用GRANT修改账户属性而不是权限分配。这包括身份验证,SSL和资源限制属性。而是使用CREATE USER在创建帐户时创建这些属性,或者使用ALTER USER修改它们。


SET PASSWORD 语句和PASSWORD()函数。替代的,使用 ALTER USER 来变更用户的密码,兵器避免在任何文本中使用PASSWORD()


old_passwords 系统变量



2.依赖于MySQL 5.7中的隐式GROUP BY排序已被弃用。要实现分组结果的特定排序顺序,最好使用显式的ORDER BY子句。GROUP BY排序是一个MySQL扩展,可能会在将来的版本中更改; 例如,使优化程序可以以任何它认为最有效的方式排序分组,并避免排序开销


3.EXPLAIN语句的EXTENDED和PARTITIONS关键字。这些关键字仍然可以识别,但现在不需要,因为它们的效果总是被启用。


4. --skip-innode 选项和其同义词(--innodb=OFF,--disable-innode,等等)。这个选项在 MYSQL 5.7 中无影响。因为InnoDB 不能被禁用。


5.log_warnings 系统变量和 --log-warnings 服务选项。使用 log_error_verbosity 系统变量替代


6.binlog_max_flush_queue_time系统变量在MySQL 5.7中不做任何事情,不建议使用

从MySQL 5.7.9开始。


7.让InnoDB 在XA事务中支持二段式提交的 innodb_support_xa系统变量,在MySQL 5.7.10中过期。InnoDB 在MYSQL 5.7.10中的XA事务的二段式提交总是启用支持的。



8.metadata_locks_cache_size 和 metadata_locks_hash_instances 在 MySQL 5.7.4之后不发挥任务和作用


9. sync_frm 系统变量


10.全局 character_set_database 和 collation_database 系统变量被过期,并且将在后面的MYSQL 版本被移除。


为会话分配值character_set_database和collation_database系统变量已弃用,分配会产生警告。会话变量将变成只读在未来版本的MySQL中,分配会产生一个错误。访问会话变量以确定默认数据库的数据库字符集和排序规则仍然是可能的。


11.ENCRYPT(), ENCODE(), DECODE(), DES_ENCRYPT(), 和 DES_DECRYPT() 加密函数。考虑使用

AES_ENCRYPT() 和 AES_DECRYPT() 代替


12.MBREqual() spatial 韩式,使用 MBREquals() 代替


13.INFORMATION_SCHEMA.PROFILING 使用性能方案替代


14. mysqld_safe 支持syslog 输出。使用 自然服务器 syslog 支持替代


15.mysqlcheck 中的 --fix-db-names 和 --fix-table-names 选项过期,alter database 的 UPGRADE DATA DIRECTORY NAME 子句也过期了。




已经移除的特性

以下内容已过时,并已在MySQL 5.7中删除。如果显示替代方案,应用程序应该更新使用它们。


2.早期4.1密码哈希格式被移除。应用程序使用特性的将不再被支持,需要调整。

--secure-auth 选项 对于 server 和 client 程序是默认的,但是现在不是了。其将过期,并且在之后的MySQL 版本中将被移除。


--skip-secure-auth 选项 将不再被支持,如果使用会出错。


secure_auth 系统变量只能是1,0不再被允许


对于old_passwords 系统变量,值1将不再被允许。


OLD_PASSWORD() 函数被移除


2.在MySQL 5.6.6, YEAR(2) 数据类型被过期。如果你升级到5.7.5或更高版本,任何 YEAR(2)字段 必须转换为YEAR(4)。例如zai 升级之后运行 mysql_upgrade


3.innodb_mirrored_log_groups系统变量。只支持值为1,所以不再有意义


4,.storage_engine 变量使用 default_storage_engine 替代。


5.thread_concurrency 系统变量


6.timed_mutexes 系统变量,已经没有效果


7. ALTER TABLE 的 IGNORE子句


8. INSERT DELAYED 不再被支持。服务器识别但是会忽略 DELAYED关键字,处理插入为非延时插入,并生成一个 ER_WARN_LEGACY_SYNTAX_CONVERTED 告警。(“INSERT DELAYED”不再支持。这个语句被转换为 INSERT)。同样的 REPLACE DELAYED 也被处理为 非延时替换。DELAYED 关键字将在之后的版本移除。


除此之外,DELAYED-相关的一系列选项和特性也被移除:

mysqldump. 的 --delayed-insert 选项


性能方案中的table_lock_waits_summary_by_table 表上的COUNT_WRITE_DELAYED, SUM_TIMER_WRITE_DELAYED, MIN_TIMER_WRITE_DELAYED,AVG_TIMER_WRITE_DELAYED, 和MAX_TIMER_WRITE_DELAYED 字段。


mysqlbinlog 在提到 INSERT DELAYED 时不再写内容。


9.mysql_upgrade 中没有用的 --basedir, --datadir, --tmpdir 选项被移除


10.之前在 指定 选项的时候可以使用简写,例如 在mysqldump 中 -compr 可以使用--comp。但是现在只支持全选项。例如:

--key-buffer 选项,现在必须指定为:--key-buffer-size.

--skip-grant 选项,现在必须指定为 --skip-grant-tables.



11.指定表明来启用和禁用标准Innodb监控和 Innode 锁监控((innodb_monitor 和innodb_lock_monitor)在 5.7.4被移除。使用innodb_status_output 和 innodb_status_output_locks 动态系统变量提到



12 msql2mysql, mysql_convert_table_format, mysql_find_rows,mysql_fix_extensions, mysql_setpermission, mysql_waitpid, mysql_zap, mysqlaccess,mysqlbug 工具


13.mysqlhotcopy 工具,可以用msqldump 和 Mysql 企业备份提到。


14.binary-configure.sh 脚本




本节列出了您可能会发现的其他信息的来源,如MySQL邮件列表和用户论坛以及Internet Relay Chat。


lists.mysql.com/

http://forums.mysql.com


http://dev.mysql.com/doc/. --在线帮助文档

bugs.mysql.com/ --搜索BUG




查询相关的sql_mode ,利用 SHOW CREATE PROCEDURE 或者 SHOW CREATE FUNCTION 语句。或者查询 INFORMATION_SCHEMA:

SELECT ROUTINE_SCHEMA, ROUTINE_NAME, SQL_MODE FROM INFORMATION_SCHEMA.ROUTINES;


对于触发器,可以使用下列语句

SELECT EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE, TRIGGER_NAME, SQL_MODE FROM INFORMATION_SCHEMA.TRIGGERS;




下面是一个 SELECT语句 性能相关的BUG或者问题的分析例子:

mysql> SHOW VARIABLES;

mysql> SHOW COLUMNS FROM ...\G

<output from SHOW COLUMNS>

mysql> EXPLAIN SELECT ...\G

<output from EXPLAIN>

mysql> FLUSH STATUS;

mysql> SELECT ...;

<A short version of the output from SELECT,

including the time taken to run the query>

mysql> SHOW STATUS;

<output from SHOW STATUS>


--使用\G 格式化输出



如果数据发生损坏,或者当你访问常规表时出现错误,首先使用check table 检查表。如果语句报告任何错误:

InnoDB 崩溃恢复机制i在 服务器被kill 之后重启的时候进行了 清理,所以在典型的操作中不需要“修复”表格。如果遇到了任何错误,重启服务器,看是否还存在问题,是否问题仅仅只被内存中的缓存数据影响。如果数据在磁盘被损坏,那么使用innodb_force_recovery 选项启动,让你能dump 出被影响的表。



----- MYSQL 于标准 SQL 规范的区别


mysql 是使用 || 和 && 作为逻辑操作符, 等价于 OR 和AND 。连接字符串必须使用CONCAT()函数,这个函数和oracle 是一样的。




=, <>, <=, <, >=, >, <<, >>, <=>, AND, OR, or LIKE 这些操作也可以写到 SELECT 语句的左边。例如:

mysql> SELECT col1=1 AND col2=2 FROM my_table;


--在MYSQL 中,删除表,不会自动回收权限,必须显示的使用revoke 语句。



MYSQL 不支持 SELECT ... INTO TABLE 语法,支持INSERT INTO ... SELECT 标准语法 ,例如:

INSERT INTO tbl_temp2 (fld_id)

SELECT tbl_temp1.fld_order_id

FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;


替代的,你可以使用 SELECT ... INTO OUTFILE 或 CREATE TABLE ... SELECT

您可以使用SELECT ... INTO和用户定义的变量。在使用游标和局部变量存储的例程中也可以使用相同的语法。




Update 的区别:

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

--col2 会使用当前最新的col1值,这就导致 col2和col1 是一样的。



注释符:

支持标准语句注释 * */ ,也支持行注释符--和 #。

但是在下列语句中:

UPDATE account SET credit=credit--1

因为-- 是一个注释的开始,所以这个表达式一部分无效。结果是一个与预期完全不同的含义的语句:

UPDATE account SET credit=credit


所以在 -- 后面需要加一个空格,在其被认为是注释开始的时候。

还一种方式是 mysql 命令行客户端忽略--


如果在你的sql 脚本中包含--的注释,你需要使用replace 工具 转换为#,在你执行脚本之前:

shell> replace " --" " #" < text-file-with-funny-comments.sql \

| mysql db_name

这比以通常的方式执行脚本更安全:

mysql db_name < text-file-with-funny-comments.sql


您也可以编辑脚本文件“到位”,将“ - ”注释更改为“#”注释:

replace " --" " #" -- text-file-with-funny-comments.sql

Change them back with this command:

replace " #" " --" -- text-file-with-funny-comments.sql




1.8.3 Mysql 如何处理约束


MySQL使您能够同时使用允许回滚的事务表和非事务性表。因此,MySQL中的约束处理有点不同于其他DBMS。如果在非事务性表中插入或更新了很多行,并且发生错误时无法回滚更改,则必须处理这种情况。


基本的理念是,MySQL服务器试图在解析要执行的语句时检测到任何可以检测到的错误,并尝试从执行语句时发生的任何错误中恢复。我们在大多数情况下都这样做,但还不是全部。


MySQL出现错误时的选项是在中间停止语句,或者尽可能地从问题中恢复并继续。默认情况下,服务器遵循后面的过程。这意味着,例如,服务器可能会将无效值强制为最接近的有效值。


有几种SQL模式选项可用于更好地控制错误数据值的处理,以及是否继续执行语句或在错误发生时中止。使用这些选项,您可以将MySQL服务器配置为更传统的方式,就像其他DBMS一样拒绝不正确的输入。可以在服务器启动时全局设置SQL模式,以影响所有客户端。单独的客户端可以在运行时设置SQL模式,这使得每个客户端可以选择最适合其需求的行为。参考5.1.7, “Server SQL Modes”.




1.8.3.1 主键约束和 唯一索引约束


通常,数据更改语句(如INSERT或UPDATE)会发生会违反主键,唯一键或外键约束的错误。如果您正在使用诸如InnoDB之类的事务性存储引擎,则MySQL会自动回滚该语句。如果您正在使用非事务性存储引擎,则MySQL将停止处理发生错误的行的语句,并保留任何剩余的行未处理。


MySQL支持INSERT,UPDATE等IGNORE关键字。如果使用它,MySQL将忽略主键或唯一键违规,并继续处理下一行。请参阅您正在使用的语句部分(第13.2.5节“INSERT语法”,第13.2.11节“UPDATE语法”等)。


您可以通过mysql_info()C API函数获取有关实际插入或更新的行数的信息。您还可以使用SHOW WARNINGS语句。请参见第23.8.7.36节“mysql_info()”和第13.7.5.40节“SHOW WARNINGS Syntax”。


当前只有InnoDB 表支持外键




1.8.3.2 外键约束

外键让你可以在表间交叉引用相关数据,外键约束有助于保持这个分布式数据的一致性。



MYSQL 支持在CREATE TABLE 和ALTER TABLE 语句中 使用 ON UPDATE 和 ON DELETE语句。

可用的引用操作是RESTRICT(默认),CASCADE,SET NULL和NO ACTION。


SET DEFAULT也被MySQL服务器支持,但是InnoDB目前被拒绝。由于MySQL不支持延迟约束检查,因此NO ACTION被视为RESTRICT。



MATCH FULL,MATCH PARTIAL和MATCH SIMPLE是允许的,但是应该避免使用它们,因为它们会导致MySQL服务器忽略同一语句中使用的任何ON DELETE或ON UPDATE子句。MATCH选项在MySQL中没有任何其他效果,这实际上是全面实施MATCH SIMPLE语义。



MySQL要求索引外键列; 如果您使用外键约束创建表,但在给定列上没有索引,则会创建一个索引。


您可以从INFORMATION_SCHEMA.KEY_COLUMN_USAGE获取有关外键的信息

表。此处显示针对此表的查询的示例:

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME

> FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE

> WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;


有关InnoDB表上外键的信息,也可以在INFORMATION_SCHEMA数据库的INNODB_SYS_FOREIGN和INNODB_SYS_FOREIGN_COLS表中找到。



1.8.3.3 约束和无效数据

默认情况下,MySQL可以忽略无效或不正确的数据值,并将其强制为有效的数据输入值。但是,您可以启用严格的SQL模式来选择对错误值的更传统处理,以便服务器拒绝它们并中止它们出现的语句



本节介绍MySQL的默认(宽容)行为,以及严格的SQL模式及其不同之处。


如果不使用严格模式,那么每当向列中插入一个“不正确的”值时,例如将NULL到 NOT NULL列中或数值太大的数值插入到数字列中,MySQL会将列设置为“best 可能的价值“,而不是产生一个错误:下面的规则更详细地描述了这是如何工作的:

1.如果您尝试将超出范围的值存储到数字列中,则MySQL服务器将存储零,最小可能值或最大可能值(取其最接近的无效值)。

2.对于字符串,MySQL可以存储空字符串或存储在列中的尽可能多的字符串。

3.如果您尝试将不以数字开头的字符串存储到数字列中,则MySQL服务器将存储0。

4.ENUM和SET列的无效值按照第1.8.3.4节“ENUM和SET约束条件”中的描述进行处理。

5.MySQL允许您将某些不正确的日期值存储到DATE和DATETIME列(如“2000-02-31”或“2000-02-00”)。在这种情况下,当应用程序没有启用严格的SQL模式时,应用程序在存储它们之前验证日期。如果MySQL可以存储日期值并检索完全相同的值,则MySQL会按照给定值存储它。如果日期完全错误(在服务器存储能力以外),则特殊的“零”日期值“0000-00-00”被存储在列中。

6.如果尝试将NULL存储到不包含NULL值的列中,则单行INSERT语句会发生错误。对于多行INSERT语句或INSERT INTO ... SELECT语句,MySQL服务器存储列数据类型的隐式默认值。通常,数字类型为0,字符串类型为空字符串(''),日期和时间类型为“0”。第11.7节“数据类型默认值”中讨论了隐式默认值。

6.如果INSERT语句为列指定了任何值,那么如果列定义包含明确的DEFAULT子句,则MySQL将插入其默认值。如果定义没有这样的DEFAULT子句,MySQL将为列数据类型插入隐式缺省值。


在非严格模式下使用上述规则的原因是我们无法检查这些条件,直到语句开始执行。如果在更新几行后遇到问题,我们不能回滚,因为存储引擎可能不支持回滚。终止语句的选择并不好; 在这种情况下,更新将是“一半完成”,这可能是最糟糕的情况。在这种情况下,最好是“尽力而为”,然后继续。


您可以使用STRICT_TRANS_TABLES或STRICT_ALL_TABLES SQL模式选择更严格的输入值处理方式:


SET sql_mode = 'STRICT_TRANS_TABLES';

SET sql_mode = 'STRICT_ALL_TABLES';


STRICT_TRANS_TABLES为事务性存储引擎启用了严格模式,在一定程度上也为非事务性引擎启用了严格模式。它是这样工作的:

1.对于事务性存储引擎,语句中任何地方发生的错误数据值都会导致语句中止并回滚。

2.对于非事务性存储引擎,如果在要插入或更新的第一行中发生错误,语句将中止。(当错误发生在第一行时,语句可以被中止以保持表不变,就像事务表一样。) 错误发生在第一行之后的化,会终止语句,但是表已经被第一行更改了。而是调整不良数据值,导致警告而不是错误。换句话说,在STRICT_TRANS_TABLES 下,一个错误的值会导致MySQL回滚到目前为止所做的所有更新,如果这可以在不更改表的情况下完成的话。但是一旦表被改变,进一步的错误会导致调整和警告(不会回滚而是尽可能执行)。



为了更严格的检查,启用STRICT_ALL_TABLES。这与STRICT_TRANS_TABLES相同,只是对于非事务性存储引擎,即使对于第一行之后的行中的错误数据,错误也会中止语句。这意味着如果在多行插入或更新非事务表中发生错误,则会导致部分更新。先前的行被插入或更新,但是从错误的角度来看不是。为了避免这种情况发生,请使用单行语句,否则使用STRICT_TRANS_TABLES,如果转换警告而不是错误是可以接受的。为了避免出现问题,请不要使用MySQL来检查列内容。让应用程序确保只传递有效值到数据库是最安全的(也是更快)。


使用严格模式选项中的任何一个,都可以通过使用INSERT IGNORE或UPDATE IGNORE 来替代insert和update 语句 来将错误视为警告。





1.8.3.4 ENUM 和 SET 约束

ENUM和SET列提供了一种有效的方法来定义只能包含一组给定值的列。


在严格模式启用的情况下(参见第5.1.7节“服务器SQL模式”),ENUM或SET列的定义作为输入到列中值的约束。不符合这些条件的值发生错误:

1.ENUM值必须是列定义中列出的值或其内部数字等效值。该值不能是错误值(即0或空字符串)。对于定义为ENUM('a','b','c')的列,诸如“',”d“或”ax“的值是无效的并被拒绝。

2.SET值必须是空字符串或仅由列定义中列出的值组成的值,以逗号分隔。对于定义为SET('a','b','c')的列,诸如“d”或“a,b,c,d”的值是无效的并被拒绝。


如果您使用INSERT IGNORE或UPDATE IGNORE,则无效值的错误可以在严格模式下被抑制。在这种情况下,会生成警告而不是错误。对于ENUM,该值被插入为错误成员(0)。对于SET,除了删除任何无效的子字符串之外,该值被插入。例如,'a,x,b,y'的值为'a,b'。


文章转载自上帝就在星空上,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论