浅谈MySQL Online DDL(中)

本文首发于个人微信公众号《andyqian》,期待你的关注!

前言

  在上一篇文章中《浅谈MySQL Online DDL (上)》中,我们谈到了MySQL Online DDL的由来,还介绍了聚簇索引与二级索引的区别。今天,我们继续谈谈MySQL Online DDL。

Online DDL优点

  在上篇文章中,我们知道了『快速索引创建』的优点,对于MySQL 5.7版本来说,这也就成为了Online DDL的优点了,而且增强了不少。优点如下:

  1. 不影响生产环境数据库运行,在DDL操作时,不影响生产上的查询,以及DML操作。

  2. 减少在创建,修改二级索引时,带来没必要的数据复制,临时表创建时的磁盘与IO开销。

  3. 能够人为通过Lock语句平衡性能与开销。

Online DDL语法

  Online DDL语法上,其实并没有特殊的之处的。我们知道Online DDL这个概念在MySQL5.6首次出现,虽然在语法上没有特殊的之处,但官方为我们在原来的DDL语法上添加了一些控制性能与并发的属性,这里以alter为例(如下所示):
演示MySQL版本: 5.7.20

alter table t_base_user modify telephone varchar(50),lock=none ;

上面这条语句非常简单,就是修改 t_base_user 表中 telephone字段属性。
其中 lock=none 是我们比较陌生的,这个就是MySQL5.6中用来控制性能的属性,需要注意的是,在MySQL5.6之前的版本中,这样的语法是不支持的。执行时会直接报语法不支持的错误。那 lock=none 代表什么意思呢?

锁类型

  Online DDL语句和DDL语句是一样的,执行时同样的会加锁,(这里就统一说成锁吧,MySQL锁是一个比较大的话题,下次详细说明)。

官方给我们提供了几个可选项:

  1. LOCK=EXCLUSIVE : 表示独占锁,DDL语句执行期间会阻塞该表的所有请求。

  2. LOCK=SHARED:共享锁,DDL语句执行期间会阻塞除查询外的所有DML操作,如: insert,update等。

  3. LOCK=NONE: 允许所有查询以及DML操作。

  4. LOCK=DEFAULT 默认级别,MySQL尽可能允许最大的并发操作。

当我们不显示指定时,默认就为LOCK=DEFAULT类型。

需要注意的是:

  1. 不是所有的DDL操作LOCK类型都可以指定为NONE的。如果DDL操作的类型,不能以请求的锁定类型执行,则会执行失败。

rows affected

  在执行有些DDL语句时(修改字段类型),其实是有风险的,那怎么避免风险呢?这个时候就要通过执rows affected类分析了。
如下所示:

mysql> alter table t_base_user modify telephone varchar(50),lock=none ;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

这里显示我们修改t_base_user表telephone字段会非常快,而且不会重建表。这是由于演示数据比较少导致的。当生产数据比较多时,是会重建表的。

下面给出了一些参考选项:

  1. 更改列的默认值(超快,完全不影响表数据):

    Query OK, 0 rows affected (0.07 sec)
  2. 添加一个索引(需要时间,但是0 rows affected显示表格不被复制):

    Query OK, 0 rows affected (21.42 sec)
  3. 更改列的数据类型(需要大量的时间,并且需要重建表的所有行):

    Query OK, 1671168 rows affected (1 min 35.54 sec)

    我们可以通过上述的执行结果,查看该语句是否复制记录,重建整个表格(我们上篇说过,如果重建,成本会非常高,而且还会影响线上DML)等。显然,直接在生产上运行该语句后,再看结果来分析。已经没有意义了,我们可以通过在测试环境中来看。具体步骤如下:

  4. 复制需要ddl的生产表结构到测试环境中。

  5. 添加部分数据到该表中。

  6. 执行ddl操作。

  7. 查看rows affected 值是否为0,非0时,意味着操作需要重建整个表,这时候就需要重新指定方案,如:在停机时进行操作,或业务低估时进行操作。

今日命令

命令:

SHOW CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

作用:显示指定数据库的创建语句。
例子:

mysql> show create database andyqian\G
*************************** 1. row ***************************
       Database: andyqian
Create Database: CREATE DATABASE `andyqian` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */
1 row in set (0.00 sec)

其中:
Database 表示数据库名。
Create Database 表示创建数据库语句。

这里需要注意的是:

show create database andyqian\G

show create schema andyqian\G

上述两个语句的,执行结果是一样的。

注意

  1. andyqian为指定的数据库名,请替换至自己需要显示的数据库名。

  2. 在 Navicat 第三方工具时运行时,不需要添加\G。命令如下即可:
    show create schema andyqian;

小结

  在这一篇中,我们简单了介绍了MySQL Online DDL的语法,以及锁类型等等。其实Online DDL也是有条件限制的,以及Online DDL语句的实现细节,我们在下一篇文章中继续说。尽请期待!

最后:周五了,马上就周末了,准备好周末怎么过了吗?

 

推荐阅读:

浅谈MySQL Online DDL (上)

MySQL事务隔离级别

MySQL表设计踩过的坑!

谈谈MySQL隐式类型转换

 

092341_fEn4_1462914.gif

扫码关注,一起进步

个人博客: http://www.andyqian.com

转载于:https://my.oschina.net/u/1462914/blog/1583257

<think>我们正在处理用户关于MySQL online DLL文件下载及使用的问题。根据引用内容,用户可能误解了“Online DDL”的概念,实际上Online DDLMySQL中用于在线修改表结构的技术,与动态链接库(DLL)无关。动态链接库通常指的是Windows系统中的.dll文件。 用户可能真正需要的是MySQL的客户端库或连接器(例如libmysql.dll或mysql-connector-c等),这些库文件用于应用程序连接MySQL数据库。 因此,我们需要引导用户正确理解需求,并提供获取MySQL连接器或客户端库的方法。 步骤: 1. 澄清概念:解释Online DDL与动态链接库(DLL)的区别。 2. 提供解决方案:指导用户如何下载和使用MySQL的客户端动态链接库(DLL)。 注意:MySQL官方提供的连接器包括动态链接库,例如C连接器(libmysql.dll)或ODBC驱动等。 具体回答: 1. 解释Online DDLOnline DDLMySQL的一种在线表结构变更技术,与动态链接库无关。 2. 确认用户需求:用户可能需要MySQL的客户端动态链接库(DLL)来开发或运行应用程序。 3. 提供下载链接:MySQL官方网站提供各种连接器的下载,包括C连接器(包含libmysql.dll)等。 4. 使用说明:指导用户如何将DLL文件放置在合适的位置,并在应用程序中引用。 同时,考虑到用户可能是开发者,我们可以提供一些常见的开发场景下的使用指导。 根据引用内容,我们还可以提供一些额外的建议,比如在低峰期执行大表DDL操作,使用第三方工具(如pt-online-schema-change、gh-ost)等,但这些与DLL文件无关,所以可能不适用于当前问题。不过,我们可以提醒用户,如果实际需要的是执行Online DDL操作,那么可以使用这些工具和方法。 但是,用户明确提到了“下载及使用”,因此我们重点放在DLL文件的获取和使用上。 生成相关问题: 1. MySQL的C连接器如何配置? 2. 如何在Windows系统中使用MySQL的动态链接库? 3. 除了动态链接库,MySQL还提供哪些连接方式? 注意:引用内容中并没有直接关于DLL下载的信息,所以我们将主要依靠一般知识来回答。 回答结构: 1. 澄清概念 2. 提供下载方法 3. 使用步骤 4. 常见问题 5. 生成相关问题</think>### MySQL 动态链接库(DLL)文件下载及使用指南 您提到的 **MySQL Online DDL** 是表结构变更技术(如添加/删除列),与动态链接库(DLL)无关。若您需要 **MySQL 动态链接库文件**(如 `libmysql.dll` 或 `mysqlclient.dll`),以下是解决方案: --- ### 一、获取 MySQL DLL 文件 #### 方法 1:官方安装包提取(推荐) 1. **下载 MySQL 社区版** 访问 [MySQL 官方下载页](https://dev.mysql.com/downloads/installer/) 选择 **Windows (x86/x64)** 安装包(如 `mysql-installer-community-*.msi`) 2. **提取 DLL 文件** 安装时选择 **Custom** 模式,仅勾选: - `MySQL Server` → `Development Components` → **`Client C API library (shared)`** 完成安装后,DLL 文件默认位于: ```path C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.dll ``` #### 方法 2:直接下载连接器 - **MySQL Connector/C**(C语言开发专用): [下载地址](https://dev.mysql.com/downloads/connector/c/) 解压后获取 `lib\libmysql.dll` 或 `bin\libmysql.dll` --- ### 二、使用 DLL 文件 #### 场景 1:应用程序依赖 将 `libmysql.dll` 放入: - 应用程序的 `bin` 或 `exe` 同级目录 - 系统路径 `C:\Windows\System32`(不推荐,可能冲突) #### 场景 2:开发环境配置(以 C++ 为例) ```cpp #include <mysql.h> int main() { MYSQL *conn = mysql_init(NULL); conn = mysql_real_connect(conn, "localhost", "user", "password", "db", 3306, NULL, 0); if (conn) { printf("Connected to MySQL!\n"); mysql_close(conn); } return 0; } ``` **编译时需链接库**: - Visual Studio:项目属性 → 链接器 → 附加依赖项 → 添加 `libmysql.lib` - GCC:添加编译参数 `-lmysqlclient` --- ### 三、常见问题解决 1. **缺失 DLL 错误** - 检查路径是否正确,使用 [Dependency Walker](https://www.dependencywalker.com/) 分析依赖 - 安装 [Microsoft Visual C++ Redistributable](https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0) 2. **32/64 位不匹配** 确保应用程序架构与 DLL 版本一致(x86 或 x64) 3. **版本兼容性** 使用 `mysql_get_client_version()` 函数验证 DLL 版本: ```cpp printf("MySQL client version: %d\n", mysql_get_client_version()); ``` --- ### 四、替代方案(无需 DLL) 若您实际需要 **数据库连接** 而非 DLL: - **ODBC 驱动**:安装 [MySQL Connector/ODBC](https://dev.mysql.com/downloads/connector/odbc/) - **.NET 开发**:使用 [MySqlConnector](https://mysqlconnector.net/)(NuGet 包) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值