热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql源码解析,mysql开源代码

本文目录一览:1、MySQL与Redis数据库连接池介绍(图示+源码+代码演示)

本文目录一览:


  • 1、MySQL与Redis数据库连接池介绍(图示+源码+代码演示)


  • 2、mysql内核源码是什么语言写的


  • 3、MySQL 常用备份工具流程解析


  • 4、如何编辑和浏览Mysql源码

MySQL与Redis数据库连接池介绍(图示+源码+代码演示)

数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

简单的说:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

不使用数据库连接池

如果不使用数据库连接池,对于每一次SQL操作,都要走一遍下面完整的流程:

1.TCP建立连接的三次握手(客户端与 MySQL服务器的连接基于TCP协议)

2.MySQL认证的三次我收

3.真正的SQL执行

4.MySQL的关闭

5.TCP的四次握手关闭

可以看出来,为了执行一条SQL,需要进行大量的初始化与关闭操作

使用数据库连接池

如果使用数据库连接池,那么会 事先申请(初始化)好 相关的数据库连接,然后在之后的SQL操作中会复用这些数据库连接,操作结束之后数据库也不会断开连接,而是将数据库对象放回到数据库连接池中

资源重用:由于数据库连接得到重用,避免了频繁的创建、释放连接引起的性能开销,在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

更快的系统响应速度:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。 此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了从数据库连接初始化和释放过程的开销,从而缩减了系统整体响应时间。

统一的连接管理,避免数据库连接泄露:在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄露。

如果说你的服务器CPU是4核i7的,连接池大小应该为((4*2)+1)=9

相关视频推荐

90分钟搞懂数据库连接池技术|linux后台开发

《tcp/ip详解卷一》: 150行代码拉开协议栈实现的篇章

学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

需要C/C++ Linux服务器架构师学习资料加qun 812855908 获取(资料包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享

源码下载

下载方式:(Github中下载)

db_pool目录下有两个目录,mysql_pool目录为MySQL连接池代码,redis_pool为redis连接池代码

下面介绍mysql_pool

CDBConn解析

概念: 代表一个数据连接对象实例

相关成员:

m_pDBPool:该数据库连接对象所属的数据库连接池

构造函数: 绑定自己所属于哪个数据库连接池

Init()函数: 创建数据库连接句柄

CDBPool解析

概念:代表一个数据库连接池

相关成员:

Init()函数:常见指定数量的数据库实例句柄,然后添加到m_free_list中,供后面使用

GetDBConn()函数: 用于从空闲队列中返回可以使用的数据库连接句柄

RelDBConn()函数: 程序使用完该数据库句柄之后,将句柄放回到空闲队列中

测试之前,将代码中的数据库地址、端口、账号密码等改为自己的(代码中有好几处)

进入MySQL, 创建mysql_pool_test数据库

进入到mysql_pool目录下, 创建一个build目录并进入 :

然后输入如下的命令进行编译

之后就会在目录下生成如下的可执行文件

输入如下两条命令进行测试: 可以看到不使用数据库连接池,整个操作耗时4秒左右;使用连接池之后,整个操作耗时2秒左右,提升了一倍

源码下载

下面介绍redis_pool

测试

进入到redis_pool目录下, 创建一个build目录并进入 :

然后输入如下的命令进行编译

之后就会在目录下生成如下的可执行文件

输入如下的命令进行测试: 可以看到不使用数据库连接池,整个操作耗时182ms;使用连接池之后,整个操作耗时21ms,提升了很多

进入redis,可以看到我们新建的key:

mysql内核源码是什么语言写的

mysql的内存管理庞大而先进,这在mem0pool.c文件的开头注释中都有说明,粗略的可以分成四部分,包含9大块:

buffer pool,

parsed andoptimized SQL statements,

data dictionarycache,

log buffer,

locks for eachtransaction,

hash table forthe adaptive index,

state andbuffers for each SQL query currently being executed,

session foreach user, and

stack for eachOS thread.

9大块通过4部分进行管理

A solution tothe memory management:

1. the bufferpool size is set separately;

2. log buffersize is set separately;

3. the commonpool size for all the other entries, except 8, is set separately.

也就是缓冲池,redo日志缓冲,普通池和8(用户session信息,可看做一部分)

redo日志缓冲由redo部分单独管理,bufferpool也就是缓冲池是一个复杂的部分,内容很多,普通池上面说了,除了8,和1,2.其余的都归它管。上面这个结构就是mysql内存子系统的完整图景。

所以说是c和c++写的

MySQL 常用备份工具流程解析

下面我们就看一下常见的备份工具,以及目前最流行的 Percona XtraBackup 的备份流程。

MySQL 常见的备份工具主要分为三种:

这里先说一下 binlog 备份,它只是把 binlog 又复制了一份,并且需要在逻辑备份或者物理备份的基础上才能进行数据恢复,无法单独进行数据恢复。

mysqldump 备份出的文件就是 sql 文件,其核心就是对每个表执行 select ,然后转化成相应的 insert 语句。mysqldump 的备份流程大致如下:

从上面可以看出在 mysqldump 备份期间,备份到某个数据库时,该数据库下的表都会处于只读状态,无法对表进行任何变更,直到该库下的表备份完毕,这对于线上环境一般是无法接受的。若是指定了--master-data或者 --dump-slave 则会在备份开始时加全局读锁(FLUSH TABLES WITH READ LOCK),直到备份结束。当然我们可以选一个从库进行备份,这样就不会影响线上业务。另外使用 mysqldump 备份还有一个最大的好处,因为备份出来的是 sql 语句,所以它支持跨平台和跨版本的数据迁移或者恢复,这是物理备份无法做到的。

但是也正是因为 mysqldump 备份出来的是 sql 语句,在使用时要更加注意,否则可能会酿成大祸。例如,使用 mysqldump 常见的问题有:

所以使用 mysqldump 时一定要了解各个选项的作用,以及确认备份出来的 sql 文件里会有什么操作,会对现有数据造成什么影响。

Mydumper 原理与 Mysqldump 原理类似,最大的区别是引入了多线程备份,每个备份线程备份一部分表,当然并发粒度可以到行级,达到多线程备份的目的。这里不再单独介绍。

Percona XtraBackup 是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,是基于 InnoDB 的崩溃恢复功能来实现的。它的基本工作原理如下:

Percona XtraBackup 在进行恢复时会应用拷贝的 redo log ,应用已提交的事务,回滚未提交的事物,将数据库恢复到一致性状态。因为 Percona XtraBackup 备份出来的是物理文件,所以在使用备份出的文件进行恢复或者迁移时,不会像 mysqldump 那样会存在很多问题。

使用 XtraBackup 备份时根据备份参数设置不同,对数据库的变更会造成不同程度的影响,具体影响会在下文分析。

通过对比发现,XtraBackup 具有对数据库影响小,且能快速恢复的优点,在日常备份中是首选;mysqldump 使用相对更加灵活,但是使用是要注意对数据库原有数据的影响。

备份策略主要有:全量备份和增量备份,再加上 binlog 备份。

目前去哪儿网数据库备份主要采用 XtraBackup 全量备份 +binlog 备份。数据库的重要级别不同,全量备份的频率不同。备份程序主要架构如下:

说明:

Percona XtraBackup 是目前备份 MySQL 使用最广泛的工具。在备份过程中,数据库可以进行正常的读写或者其他变更操作,但是偶尔也会遇见备份引起的元数据锁,或提交事务时发现被 binlog lock 阻塞等情况。下面我们就看一下 Percona XtraBackup 的备份流程和加锁时机。

说明:以下对 Percona XtraBackup 的分析都是基于 2.4.23 的版本,其他版本会略有差别,但是关键步骤基本相同。

XtraBackup 在备份开始时,会创建一个后台线程,专门用于拷贝数据库的 redo log 。首先 XtraBackup 会扫描每组 redo log 的头部,找出当前的 checkpoint lsn ,然后从该 lsn 后顺序拷贝所有的 redo log ,包括后续新产生的 redo log 。该线程会一直持续到将非事务表完全拷贝完成,才会安全退出。备份日志输出中会记录拷贝开始时的 checkpoint lsn 。日志输出如下:

在拷贝ibd文件之前,会先扫描数据库的数据文件目录,获取ibdata1,undo tablespaces及所有的ibd文件列表,并会记录相应的 space id,因为在恢复时需要这些 space id来找到对应 doublewrite buffer里页面的内容,以及对应的redo log条目。然后开始循环拷贝ibdata1,undo tablespaces及所有的ibd文件。

这里可通过设置--parallel进行多线程备份,提高物理文件的拷贝效率。不设置则默认为1。

在所有ibd文件拷贝完成后,XtraBackup开始备份非ibd文件。这一部分的逻辑比较复杂,因为备份非ibd文件前需要加锁,具体是否会加锁主要受到--no-lock 参数设置的影响。

若是设置了--no-lock为TRUE,则不会使用"FLUSH TABLES WITH READ LOCK"去加全局读锁,但是若备份过程中对non-InnoDB表执行了DDL或者DML操作, 这会导致备份的不一致,恢复出来的数据就会有问题。所以是不建议将--no-lock为TRUE,默认值是FALSE,也就是在不指定该选项的情况下会在备份非ibd文件前加全局读锁。

下面我们结合源码来看看判断是否加全局锁这部分的具体流程逻辑:

流程图如下:

总结来看:

1)若--no-lock为FALSE(默认值),则先施加全局读锁,然后再进行拷贝文件,另外若 --safe-slave-backup 设置为TRUE ,则会在加全局锁之前关闭SQL_THREAD线程;

2)若--no-lock为TRUE,则不会施加锁,直接进行拷贝文件。

加锁的逻辑主要由lock_tables_maybe实现,先看一下lock_tables_maybe源代码,如下:

lock_tables_maybe 函数简化处理流程如下:

1)若备份实例上已经加锁( LOCK TABLES FOR BACKUP / FLUSH TABLES WITH READ LOCK)或者设置lock-ddl-per-table 则直接返回;

2)若支持备份锁,则执行LOCK TABLES FOR BACKUP;

3)若不支持备份锁,则执行 FLUSH TABLES WITH READ LOCK。根据相应选项设置,在执行该操作前会判断是否有执行中的DDL/DML,以及等待超时时间,是否kill 对应的未结束的事务等。

从上文中我们还看到一个参数--safe-slave-backup ,该参数的主要作用是:

若是在从库执行的备份操作时设置了该参数,可以防止因从库同步主库操作,而导致XtraBackup长时间请求不到锁而造成备份失败。

若是设置了 --safe-slave-backup 为TRUE,那么会执行"STOP SLAVE SQL_THREAD",并等待Slave_open_temp_tables 为零才开始拷贝非 ibd 文件,Slave_open_temp_tables 为零说明SQL thread执行的事务都已经完成,这样就能保证备份的一致性。并且此时也不会有在执行的事务阻塞 XtraBackup 施加全局锁。

备份完非 ibd 文件后,将会备份 slave 和 binlog 信息。

mysql-bin.000004 2004 6b7bda9f-15f0-11ec-ba14-fa163ea367a4:1-83,9841546e-15f0-11ec-9557-fa163e736db4:1

需要注意,在支持备份锁的实例上备份,指定了 --slave-info 或--binlog-info 均会先施加 binlog 备份锁( LOCK BINLOG FOR BACKUP),这会阻塞任何会更改 binlog 位点的操作。

备份完数据库的所有文件和binlog等相关信息,备份工作就基本完成了,之后主要执行的操作如下:

1)执行"FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS",将所有的redo log刷盘;

2)停止redo log复制线程;

3)释放全局读锁(备份锁),binlog锁;

4)开启SQL_THREAD;

5)拷贝ib_buffer_pool和ib_lru_dump文件;

6)生成配置文件backup-my.cnf;

7)打印备份信息到xtrabackup_info文件,这些信息主要包含备份时使用的参数信息,备份起止时间,binlog位点信息,以及将会回到的lsn点。

下面是xtrabackup_info记录的部分内容:

加锁对应的函数是 mdl_lock_tables ,释放锁对应的函数是 mdl_unlock_all,主要是执行COMMIT,结束 mdl_lock_tables 中开启的显式事务,来释放MDL锁。mdl_lock_tables 流程如下:

上面参数--lock-ddl和--lock-ddl-per-table是在 Percona XtraBackup 2.4.8 之后添加的,因为 MySQL 5.7 新增了一个叫做 Sorted Index Builds 的功能,这会导致某些 DDL 操作不记录重做日志而导致备份失败。使用--lock-ddl或--lock-ddl-per-table 就会在备份开始时施加锁,阻止 DDL 操作。

另外,若备份时指定了--lock-ddl或--lock-ddl-per-table,则在备份非 ibd 文件时就不是再有加锁操作。

注意:LOCK TABLES FOR BACKUP和LOCK BINLOG FOR BACKUP 语句只有在支持备份锁的实例上才会执行,Percona Server for MySQL已经在 5.6.16-64.0 版本开始支持这种更加轻量的备份锁。

Q1: 使用 XtraBackup 备份的文件进行恢复时,恢复到哪个时间点? A1:恢复到执行 LOCK BINLOG FOR BACKUP 或 FLUSH TABLES WITH READ LOCK 的时间点,因为这时任何改变 binlog 位点的操作都会被阻塞,redo log和binlog 是一致的。

Q2: 在开启 binlog 的情况下,MySQL 的奔溃恢复是同时依赖 binlog 和 redo log 这两种日志的,为什么XtraBackup 不用备份binlog?

A2:因为在备份中有执行LOCK BINLOG FOR BACKUP/FLUSH TABLES WITH READ LOCK,阻止了任何改变binlog位点的操作,这样只需要根据redo log将有commit log 的事务提交,没有commit log的事务进行回滚即可。

Q3: 使用Percona XtraBackup备份完成后redo的位点是和binlog是一样还是比binlog多一些?

A3:通过分析备份流程可以发现备份 binlog 位点信息(加binlog锁)是发生在停止 redo 拷贝线程前,而释放锁是在停止 redo 拷贝线之后,所以 redo log 会多一些。锁住了 binlog 保证了在该 binlog 位点前已经提交的事务的 redo log 都有 commit log 的信息,未提交的事物也就没有对应的 commit log 的信息,即便在锁住 binlog 后有 Innodb 表新的 DML 产生的 redo log ,但是事务无法提交,也就没有 commit log 的信息的,最后在回放的过程中对没有 commit log 的事务进行回滚就可以了。

Q4:Percona XtraBackup什么时候会加锁,以及影响加锁时间长度的因素有哪些?

A4:上面进行了分析,加锁操作只在备份非 ibd 文件时执行,加锁时长主要和非事务表的数量和大小有关,非事务表的数量越多,体积越大,拷贝文件所用的时间越长,那么加锁时间也就越长。也会和 redo log 生成的速度有关,只是 redo log 刷盘受到多个因素的影响,未及时刷盘的 redo log 一般很小。

Q5:Percona XtraBackup 和mysqldump选择哪个更好?

A5:通过上面的的解析,若是整个实例备份,首先选择 Percona XtraBackup ,因为对数据库的影响最小。若只是备份某个库表,这个就要视数据量而定,若数据量不大可以使用 mysqldump 。注意,对数据库做备份时最好选择业务连接最少的从库,因为备份也会消耗一定的资源,避免影响业务。

如何编辑和浏览Mysql源码

最佳选择是Apache(IIS也能够解析PHP)。除了web服务器之外,还要安装数据库服务和最重要的php!整个配置流程很麻烦,可以用一些集成环境如phpstudy、wamp、phpnow等。


推荐阅读
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • Node.js在服务器上的多种部署策略
    本文探讨了Node.js应用程序在服务器上部署的几种有效方法,包括使用Screen、PM2以及通过宝塔面板进行简易管理。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 华为与红帽联手,加速开源电信软件革新
    华为与红帽携手合作,旨在加速开源电信软件的发展,以满足大型电信运营商对灵活网络解决方案的需求。 ... [详细]
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • 探讨符合特定需求的个人网盘选择,包括分享功能、WebDAV支持及长期稳定性等。 ... [详细]
  • 深入解析WebP图片格式及其应用
    随着互联网技术的发展,无论是PC端还是移动端,图片数据流量占据了很大比重。尤其在高分辨率屏幕普及的背景下,如何在保证图片质量的同时减少文件大小,成为了亟待解决的问题。本文将详细介绍Google推出的WebP图片格式,探讨其在实际项目中的应用及优化策略。 ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
author-avatar
天旺店浪莎内衣_318
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有