-
mysql登录 mysql登录支持本地登录, 如下: mysql -uroot -p; //直接使用root登录, 使用密码登录 mysql 也支持远程登录, 只需要提供对应的mysql所在主机的ip地址和端口号: mysql -h IP地址 -P 端口号 -u用户名 -p; //登录远端mysql服务, 使用密码登录 mysql退出 mysql退出就是quit 什么是数据库 mysql它是数据库服务的客户端 mysqld它是数据库服务的服务器端 mysql本质:基于C(mysql)S(mysqld)模式的一种网络服务。 mysql是一套给我们提供数据存取得服务的网络程序。 数据库一般指的是, 在磁盘或者内存中存储的特定结构组织的数据 -- 将来在磁盘上存储的一套数据库方案。 数据库服务 -- mysqld。 一般的文件给我们确实提供了数据的存储功能, 但是数据并没有给我们提供非常好的数据管理能力。 数据库本质:对数据内容存储的一套解决方案。用户给数据库字段或者要求, 数据库直接给用户结果。 然后数据库的工作模式就是下图: 见一见数据库 样例:使用mysql建立一个数据库, 建立一张表结构, 插入一些数据。-- 对比一下mysql在linux中是如何表现的。 我们进入/var/lib/mysql, 可以看到里面一开始没有newdatabase文件。 但是我们在mysql中创建一个数据库后, 就能看到, /var/lib/mysql里面多出来了一个newdatabase文件。 所以, 我们就能知道, 其实建立数据库, 本质就是在linux下创建一个目录。 然后我们创建一个表: use database; //使用某个数据库 create table 表名称( 字段一 数据类型, 字段二 数据类型, 字段三 数据类型, ……………… ); //创建表结构 然后我们就能发现/var/lib/mysql/newdatabase下面多出来了一个文件: 所以我们就知道了,在数据库内建立表, 本质就是在linux下创建对应的文件即可! 问题是, 上面这两个动作是谁做的? ——是mysqld服务帮我们做的。 数据库本质其实也是文件!只不过这些文件并不由程序员直接操作,而是由数据库服务帮我们进行操作。 常见的主流数据库 常见的主流数据库其实有我们现在用的MySQL、 SQL server、Oracle、Redis等等。其中, Redis和其他三个又有区分, Redis是内存数据库, 它将数据存储在内存中, 所以有有非常快的读取速度。另外三个是关系型数据库, 基于表格结构, 适合做结构化的存储。 服务器、数据库、表关系 所谓的安装数据库服务器,其实就是在机器上面安装了一个mysqld,也就是数据库管理系统程序。 它以守护进程的形式在后台一直在运行。一次可以管理多个数据库。 这些数据库其实就是上面的DB。一般开发人员对每一个应用会创建一个数据库。 为了保证应用中实体的数据,所以一般会在数据库中创建多个表,用来保存实体中的数据 mysql架构 MySQL是一个可移植的数据库, 其实认识MySQL的架构,其实就是认识mysqld是如何进行服务的。 下面是mysqld的结构: mysql首先最上层的是客户端, 也就是mysql那个程序。 mysql的客户端其实不只是能用这个程序来充当, 还可以使用c++等语言, 或者图形化界面的工具。 然后下面就是mysqld, 也就是mysqlserver。 它整体是由我们的三层去构成。 第一层叫做链接池, 就是用来网络服务进行连接, 判断用户的身份合法性, 做一些安全管理相关的工作。 第二层就是我们的SQL相关的内容, 这一层用来将上层发来的SQL语句进行词法分析, 语法分析。 SQL语句优化等等工作。 就类似于编译器。 第三层就是进行匹配一个一个具体的存储引擎, 存储引擎就类似于驱动, 这个存储引擎从上层接收我们下达下来的一些经过词法语法分析优化后的语句,然后对它们进行解释,所以, 这一层就是真正的办事的。 SQL分类 DDL:数据定义语言——用来维护数据的结构, 用来定义表等 DML:数据操作语言——对表当中的内容进行操作。 DCL:数据控制语言——负责权限和事物的管理。 存储引擎 存储引擎:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。 MySQL采用插件式的存储引擎, 支持多种存储引擎。 查看存储引擎的指令是: show engines ——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!! ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/strive_mianyang/article/details/143477968
-
🏠 MySQL安装 1. 更新系统的软件包列表 sudo apt-get update 对于以下可能出现的问题博主是采用重装系统(简单粗暴。。)解决的,有更好的解决方法欢迎在评论区交流: 2. 安装MySQL服务器 sudo apt-get install mysql-server 3. 检查MySQL服务是否启动,若没有启动手动启动 ps axj | grep mysql 若没有则手动启动: sudo service mysql start 4. 登录MySQL(默认安装之后免密码登录) 5. 配置密码 (1) 查看root用户的身份验证方式 SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; 需要改成 mysql_native_password 方式。 (2) 修改身份验证方式 ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxxx'; (3)刷新权限 FLUSH PRIVILEGES; (4) 退出和登录 退出: exit; quit; 登录: mysql -u root -p 🏠 MySQL卸载 1. 停止MySQL服务 sudo service mysql stop 2. 卸载MySQL服务器 sudo apt-get remove --purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* 3. 删除相关依赖 sudo apt-get autoremove 4. 删除配置文件和数据库文件 sudo rm -rf /etc/mysql /var/lib/mysql 5. 清除残留的配置文件 sudo rm -rf /etc/mysql* /var/lib/mysql* /var/log/mysql* 6. 刷新系统包管理器 sudo apt-get update ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/2301_79448270/article/details/143455689
-
大家好,四季度的第一个干货合集来了,这次带来的东西主要涉及到golang,python,MySQL,redis,PostgreSQL,docker,minio,鸿蒙等等,希望可以帮助到到家 1. golang gin ShouldBind的介绍和使用示例详解【转载】 https://bbs.huaweicloud.com/forum/thread-02127165743740541019-1-1.html 2.golang flag介绍和使用示例【转载】 https://bbs.huaweicloud.com/forum/thread-0205165743832841012-1-1.html 3.Go语言中的格式化输出占位符的用法详解【转】 https://bbs.huaweicloud.com/forum/thread-0242165743874465013-1-1.html 4.Python中格式化字符串的方法总结【转载】 https://bbs.huaweicloud.com/forum/thread-02107165744051753023-1-1.html 5.Python使用进程池并发执行SQL语句的操作代码【转载】 https://bbs.huaweicloud.com/forum/thread-02111165744119162009-1-1.html 6.Mysql转PostgreSQL注意事项及说明【转】 https://bbs.huaweicloud.com/forum/thread-0205165745689855016-1-1.html 7.一文彻底讲清该如何处理mysql的死锁问题【转载】 https://bbs.huaweicloud.com/forum/thread-02111165745597896010-1-1.html 8.Redis实现分布式事务的示例【转载】 https://bbs.huaweicloud.com/forum/thread-0242165745553696016-1-1.html 9.MySQL服务无法启动且服务没有报告任何错误解决办法【转载】 https://bbs.huaweicloud.com/forum/thread-02127165745354539021-1-1.html 10.Python+OpenCV实现火焰检测【转载】 https://bbs.huaweicloud.com/forum/thread-0205165744941700014-1-1.html 11.Python Word实现批量替换文本并生成副本【转载】 https://bbs.huaweicloud.com/forum/thread-02127165744886949020-1-1.html 12.Python实现OFD文件转PDF【转载】 https://bbs.huaweicloud.com/forum/thread-0286165744755315017-1-1.html 13.Python中将文件从一个服务器复制到另一个服务器的4种方法【转】 https://bbs.huaweicloud.com/forum/thread-0242165744680560015-1-1.html 14.Python实现将pdf文档保存成图片格式【转载】 https://bbs.huaweicloud.com/forum/thread-0242165744483484014-1-1.html 15.Python通过keyboard库实现模拟和监听键盘【转载】 https://bbs.huaweicloud.com/forum/thread-0205165744195219013-1-1.html 16.docker 配置国内镜像源 https://bbs.huaweicloud.com/forum/thread-0286165634815059009-1-1.html 17.Typora 代码块Mac风格化 https://bbs.huaweicloud.com/forum/thread-02111165634917052004-1-1.html 18.MinIO上传和下载文件及文件完整性校验 https://bbs.huaweicloud.com/forum/thread-0286165634713872008-1-1.html 19.鸿蒙系统特性 https://bbs.huaweicloud.com/forum/thread-02127165634384647014-1-1.html 20.Java EasyExcel 导出报内存溢出如何解决 https://bbs.huaweicloud.com/forum/thread-02111165634289077003-1-1.html
-
前言MySQL 死锁 是指两个或多个事务互相等待对方持有的锁,从而导致所有事务都无法继续执行的现象。在 InnoDB 存储引擎中,死锁是通过锁机制产生的,特别是在并发较高、业务逻辑复杂的情况下,更容易发生死锁。一、MySQL 死锁的成因MySQL 的死锁一般发生在 行级锁 上。常见的死锁成因包括:事务 A 和事务 B 持有互相需要的锁:事务 A 锁住了记录 1,事务 B 锁住了记录 2,事务 A 尝试获取记录 2 的锁,而事务 B 试图获取记录 1 的锁,造成了死锁。不同顺序的锁定:两个事务对同一组资源请求加锁,但是加锁顺序不同,导致互相等待。例如,事务 A 按照顺序锁定记录 1 和记录 2,而事务 B 以相反的顺序锁定记录 2 和记录 1。使用了 gap lock (间隙锁):在 InnoDB 的 Next-Key Locking 机制下,间隙锁定也可能导致死锁,尤其是在范围查询时,多个事务试图锁定同一间隙。长事务和锁等待时间过长:事务执行时间长,未及时释放锁,造成其他事务等待锁超时或死锁。二、死锁检测与处理MySQL 使用 死锁检测 来处理死锁问题。MySQL 会自动检测事务是否处于死锁状态,并中止其中一个事务,释放锁以允许另一个事务继续执行。InnoDB 存储引擎通过引入死锁检测机制来解决这个问题,当检测到死锁时,会选择一个事务进行回滚,以打破僵局。被回滚的事务会抛出 Deadlock found when trying to get lock 错误。三、如何避免和处理 MySQL 的死锁?1. 合理设计索引使用合适的索引可以减少加锁的范围,降低死锁的发生概率。没有索引时,MySQL 会对表中的所有记录加锁,增加了锁冲突的机会。因此,合理地设计和使用索引,确保查询能够快速找到数据,避免不必要的锁争用,能够显著减少死锁风险。2. 保持加锁顺序一致事务操作表中的多条记录时,保持一致的加锁顺序可以有效减少死锁问题。例如,如果两个事务都需要加锁相同的资源,确保它们按照相同的顺序请求锁,避免死锁。3. 减少事务的锁定时间尽量缩短事务的执行时间,减少锁的持有时间。将事务划分为更小的逻辑单元,避免长时间占用资源。同时,将非必要的复杂操作尽量移到事务外执行。4. 减少并发度在并发较高的情况下,增加锁冲突和死锁的几率较高。可以通过控制并发度来减少锁争用,比如使用乐观锁机制,避免频繁加锁。5. 使用表锁替代行锁对于一些写操作集中的场景,可以考虑使用表锁替代行锁,以避免行级锁导致的死锁。不过表锁会导致并发性能下降,所以需要根据业务场景选择合适的锁。6. 锁定更小的范围尽量通过使用主键索引和合适的条件,减少事务锁定的行范围。特别是在 UPDATE 或 DELETE 操作中,使用精准的查询条件来限制锁的作用范围。7. 分批提交事务对于批量操作,考虑将大事务拆解成多个小事务,减少一次性加锁的行数和操作范围,减少锁的持有时间。8. 选择合适的事务隔离级别适当降低事务隔离级别可以减少锁冲突的几率。例如,可以将事务隔离级别从 Serializable 调整为 Read Committed 或 Repeatable Read,来减少行锁定的情况。9. 加锁操作使用SELECT ... FOR UPDATE当你需要在查询数据后立即进行更新时,可以使用 SELECT ... FOR UPDATE 来显式地锁定行,避免在更新时再去加锁造成的死锁。四、常见死锁示例以下是一个常见的死锁示例,两个事务尝试对相同的记录加锁但顺序不同:12345678910111213141516-- 事务 ASTART TRANSACTION;UPDATE orders SET status = 'shipped' WHERE id = 1; -- 锁住记录 1-- 此时,事务 B 在等待锁定记录 1-- 事务 BSTART TRANSACTION;UPDATE orders SET status = 'shipped' WHERE id = 2; -- 锁住记录 2-- 此时,事务 A 在等待锁定记录 2-- 事务 A 尝试更新记录 2,但事务 B 持有锁,事务 A 等待UPDATE orders SET status = 'shipped' WHERE id = 2;-- 事务 B 尝试更新记录 1,但事务 A 持有锁,事务 B 等待-- 死锁发生,MySQL 自动检测并回滚其中一个事务五、如何检测和分析死锁?通过以下方式可以检测和分析 MySQL 中的死锁:1. 启用 innodb_print_all_deadlocks 参数通过设置 innodb_print_all_deadlocks=ON,可以在 MySQL 日志中输出所有的死锁信息,便于分析和调试。2. 使用 SHOW ENGINE INNODB STATUS 命令在 MySQL 发生死锁后,可以使用 SHOW ENGINE INNODB STATUS 命令查看死锁信息。该命令会输出最近发生的死锁情况,帮助开发者找到死锁的根源。1SHOW ENGINE INNODB STATUS\G输出中包含的信息包括:哪个事务被回滚发生死锁时,事务分别持有哪些锁,等待哪些锁事务操作的 SQL 语句3. MySQL 慢查询日志开启 MySQL 慢查询日志,也可以间接帮助发现由于锁等待导致的性能问题,虽然不能直接显示死锁,但可以作为锁冲突问题排查的辅助工具。六、死锁后的应对策略当发生死锁时,MySQL 会自动回滚其中一个事务,开发人员需要捕获并处理这种异常。在代码中,你可以使用如下方式处理死锁:123456789101112try { // 执行事务 ...} catch (SQLException e) { if (e.getErrorCode() == 1213) { // 1213 代表死锁错误代码 // 死锁检测,进行重试 retryTransaction(); } else { // 其他异常处理 throw e; }}通过捕获死锁异常并进行适当的重试,系统可以在发生死锁后继续执行,从而提升系统的健壮性。
-
MySQL 服务正在启动 .MySQL 服务无法启动。服务没有报告任何错误。请键入 NET HELPMSG 3534 以获得更多的帮助。一般解决方法:D:\mysql-8.0.26-winx64\bin>sc query mysql看看是否有对应服务(对应的SQL服务名称)如果存在则会弹出一些信息,不存在则提示未找到服务。D:\mysql-8.0.26-winx64\bin>sc delete mysql(对应的SQL服务名称)执行该命令即可删除服务D:\mysql-8.0.26-winx64\bin>mysqld --initialize-insecure 初始化(会清空密码以及数据库!)D:\mysql-8.0.26-winx64\bin>mysqld -installService successfully installed.D:\mysql-8.0.26-winx64\bin>net start mysqlMySQL 服务正在启动 ..MySQL 服务已经启动成功。其他解决方法:1 考虑是否端口占用在管理员命令行窗口运行netstat -aon查看是哪个进程占用了3306端口,看的是0.0.0.0:3306对应的进程。在刚刚的命令行窗口运行taskkill /f /pid xxxx,就可以杀掉对应进程。 然后再运行net start mysql就成功了。2 检查my.ini中文件夹地址与现在的mysql文件夹地址是否一致basedir="D:/Environment/MySQL5.7.23/"datadir=D:/Environment/MySQL Data/Data
-
MySQL Dump 原理及用法详解概述MySQL Dump 是一个非常有用的工具,用于备份和恢复 MySQL 数据库。它允许用户创建数据库的逻辑备份,该备份包含了创建表结构和/或数据的 SQL 语句。通过这些 SQL 语句,可以在另一个 MySQL 服务器上重建数据库。工作原理mysqldump 程序读取 MySQL 服务器中的表定义(即 schema)以及实际的数据,并将它们转换成一系列的 SQL 语句。这些语句包括 CREATE TABLE、INSERT INTO 等,能够用来重新创建数据库的内容。当使用 mysqldump 时,可以指定是否导出结构、数据或者两者都导出。导出过程连接到 MySQL 服务器:首先,mysqldump 需要与运行中的 MySQL 服务器建立连接。获取表信息:接着,它会查询数据库中所有需要备份的表的信息。生成 SQL 语句:如果指定了导出表结构,mysqldump 将为每个表生成 CREATE TABLE 语句。如果选择导出数据,它将遍历每个表的数据行并生成相应的 INSERT 语句。输出文件:最后,所有的 SQL 语句会被写入到一个文件中,这个文件就是我们通常所说的“dump 文件”。使用方法使用 mysqldump 很简单,基本命令格式如下:mysqldump [选项] database_name > output_file.sql其中,database_name 是你想要备份的数据库名,而 output_file.sql 则是你希望保存 dump 结果的目标文件路径。常用选项-u username, --user=username:指定用户名。-p, --password[=password]:提示输入密码或直接提供密码。-h hostname, --host=hostname:指定主机名或 IP 地址。--all-databases:备份所有数据库。--no-data 或 -d:只导出数据库结构,不包含数据。--compact:生成更紧凑的输出,适合导入。--routines:同时导出存储过程和函数。--triggers:导出触发器。--events:导出事件调度器。--single-transaction:在开始转储前启动事务以确保一致性快照。示例假设你需要备份名为 my_database 的数据库,并且你的 MySQL 用户名为 root,那么你可以这样操作:mysqldump -u root -p my_database > my_database_backup.sql执行上述命令后,系统会要求你输入密码,之后就开始进行备份工作了。完成后,你会得到一个名为 my_database_backup.sql 的文件,里面包含了重建数据库所需的所有 SQL 语句。恢复数据库要从 dump 文件恢复数据库,只需利用 MySQL 客户端执行 SQL 文件即可:mysql -u root -p my_database < my_database_backup.sql这里同样需要输入密码来验证身份。
-
《》在当今数字化时代,数据的安全性和可用性至关重要。华为云数据库 GaussDB 提供了强大的主备容灾解决方案,确保在面临各种故障和灾难时,数据能够得到有效保护,业务能够持续运行。本文将详细介绍华为云数据库 GaussDB 的主备容灾搭建过程。一、了解主备容灾架构华为云数据库 GaussDB 的主备容灾架构主要由主节点和备节点组成。主节点负责处理业务请求,备节点实时同步主节点的数据。当主节点发生故障时,备节点可以迅速切换为主节点,继续提供服务,从而实现高可用性。二、准备工作注册华为云账号并开通数据库 GaussDB 服务。规划主备节点的部署位置和网络配置,确保主备节点之间能够进行数据同步和通信。确定数据库的存储需求和备份策略。三、创建主备实例登录华为云控制台,进入数据库 GaussDB 管理页面。点击 “创建数据库实例”,选择 GaussDB 的版本和规格。在创建实例页面,选择 “主备实例” 类型,并设置主节点和备节点的参数,如存储容量、网络配置等。配置数据库的用户名和密码,以及其他安全设置。确认创建实例的信息无误后,点击 “立即购买” 完成主备实例的创建。四、配置主备同步等待主备实例创建完成后,进入实例详情页面。在 “备份与恢复” 板块中,找到 “主备同步” 选项,点击 “配置”。根据实际情况设置主备同步的参数,如同步模式(同步或异步)、同步频率等。确认配置信息无误后,点击 “确定” 开始主备同步。五、测试主备容灾功能在主节点上创建一些测试数据,并进行一些数据库操作,确保主节点正常工作。模拟主节点故障,例如停止主节点的数据库服务或断开主节点的网络连接。观察备节点是否能够自动切换为主节点,并验证业务是否能够继续正常运行。恢复主节点的故障,观察主备节点之间是否能够重新进行数据同步。六、定期备份和监控制定定期备份计划,确保数据的安全性。可以使用华为云提供的自动备份功能,也可以手动进行备份。监控主备节点的运行状态,包括 CPU 利用率、内存使用率、磁盘空间等指标。可以使用华为云的监控服务或第三方监控工具。定期检查主备同步的状态,确保数据的一致性。七、总结通过以上步骤,我们成功搭建了华为云数据库 GaussDB 的主备容灾架构。主备容灾功能可以有效地提高数据库的可用性和数据的安全性,为业务的稳定运行提供坚实的保障。在实际应用中,我们还可以根据业务需求和实际情况进行进一步的优化和调整,以满足不同的业务场景。同时,定期进行备份和监控,及时发现和解决问题,确保主备容灾系统始终处于良好的运行状态。
-
在数据库的运行过程中,高可用性是至关重要的需求。华为云数据库 GaussDB 以其强大的性能和可靠的架构,为用户提供了稳定的数据存储和处理服务。其中,主备切换功能是确保数据库持续可用的关键机制之一。今天,我们就来详细了解一下华为云数据库 GaussDB 的主备切换步骤。一、主备切换的前提条件在进行主备切换之前,需要确保以下条件已经满足:已经部署了华为云数据库 GaussDB 的主备实例,并且主备实例处于正常运行状态。了解主备实例的架构和配置,包括主节点和备节点的 IP 地址、端口号、用户名和密码等信息。对数据库进行了备份,以防止切换过程中出现数据丢失的情况。二、主备切换的步骤登录华为云控制台 打开浏览器,访问华为云官网,使用账号和密码登录华为云控制台。进入数据库管理页面 在控制台中,找到 “数据库” 板块,点击 “GaussDB” 进入 GaussDB 数据库管理页面。选择要切换的主备实例 在 GaussDB 数据库管理页面中,找到要进行主备切换的实例,点击实例名称进入实例详情页面。启动主备切换 在实例详情页面中,找到 “备份与恢复” 板块,点击 “主备切换” 按钮。系统会弹出一个确认窗口,提示你主备切换可能会导致短暂的业务中断,请谨慎操作。确认无误后,点击 “确定” 按钮启动主备切换。等待主备切换完成 主备切换过程可能需要几分钟时间,具体时间取决于数据库的大小和网络状况。在切换过程中,你可以在实例详情页面中查看切换进度。当切换进度显示为 “100%” 时,表示主备切换已经完成。验证主备切换结果 主备切换完成后,需要验证切换结果是否正确。可以使用数据库客户端连接到新的主节点,检查数据库中的数据是否完整,业务是否正常运行。三、主备切换的注意事项在进行主备切换之前,建议先对数据库进行备份,以防止切换过程中出现数据丢失的情况。主备切换可能会导致短暂的业务中断,请在业务低峰期进行切换,以减少对业务的影响。在主备切换完成后,需要及时更新业务系统中的数据库连接信息,以确保业务能够正常连接到新的主节点。如果主备切换失败,可以查看系统日志和错误信息,找出失败的原因,并进行相应的处理。
-
《华为云数据库 MySQL:主备切换步骤详解》在数据库管理中,主备切换是一项重要的操作,它可以确保数据库的高可用性和数据的安全性。华为云数据库 MySQL 提供了可靠的主备架构,当主节点出现故障时,可以快速切换到备节点,保证业务的连续性。下面,我们将详细介绍华为云数据库 MySQL 的主备切换步骤。一、主备切换的前提条件在进行主备切换之前,需要确保以下条件已经满足:已经开通了华为云数据库 MySQL 服务,并创建了主备实例。了解主备实例的架构和配置,包括主节点和备节点的 IP 地址、端口号、用户名和密码等信息。对数据库进行了备份,以防止切换过程中出现数据丢失的情况。二、主备切换的步骤登录华为云控制台 打开浏览器,访问华为云官网,使用账号和密码登录华为云控制台。进入数据库管理页面 在控制台中,找到 “数据库” 板块,点击 “云数据库 MySQL” 进入数据库管理页面。选择要切换的主备实例 在数据库管理页面中,找到要进行主备切换的实例,点击实例名称进入实例详情页面。启动主备切换 在实例详情页面中,找到 “备份与恢复” 板块,点击 “主备切换” 按钮。系统会弹出一个确认窗口,提示你主备切换可能会导致短暂的业务中断,请谨慎操作。确认无误后,点击 “确定” 按钮启动主备切换。等待主备切换完成 主备切换过程可能需要几分钟时间,具体时间取决于数据库的大小和网络状况。在切换过程中,你可以在实例详情页面中查看切换进度。当切换进度显示为 “100%” 时,表示主备切换已经完成。验证主备切换结果 主备切换完成后,需要验证切换结果是否正确。可以使用数据库客户端连接到新的主节点,检查数据库中的数据是否完整,业务是否正常运行。三、主备切换的注意事项在进行主备切换之前,建议先对数据库进行备份,以防止切换过程中出现数据丢失的情况。主备切换可能会导致短暂的业务中断,请在业务低峰期进行切换,以减少对业务的影响。在主备切换完成后,需要及时更新业务系统中的数据库连接信息,以确保业务能够正常连接到新的主节点。如果主备切换失败,可以查看系统日志和错误信息,找出失败的原因,并进行相应的处理。
-
大家好,9月份合集又来了,本次主要带来的是python,redis,mysql,oralce等相关技术分享,希望可以帮到大家 1.Python语言中的重要函数对象用法小结【转】 https://bbs.huaweicloud.com/forum/thread-0292163074507230065-1-1.html 2.PyTorch中torch.no_grad()用法举例详解【转】 https://bbs.huaweicloud.com/forum/thread-02127163074675610068-1-1.html 3.解决遇到:PytorchStreamReader failed reading zip archive:failed finding central错误问题【转】 https://bbs.huaweicloud.com/forum/thread-0290163076531320030-1-1.html 4.解决遇到PermissionError:[Errno 13] Permission denied:XXXX错误的问题【转】 https://bbs.huaweicloud.com/forum/thread-0204163087169319057-1-1.html 5.使用python复制PDF中的页面的操作代码【转】 https://bbs.huaweicloud.com/forum/thread-0204163087217277058-1-1.html 6.Python中的Popen函数demo演示【转】 https://bbs.huaweicloud.com/forum/thread-0287163087322224052-1-1.html 7.Redis内存碎片率调优处理方式【转】 https://bbs.huaweicloud.com/forum/thread-02127163089843529071-1-1.html 8.oracle关联查询报invalid number错误的解决方法【转】 https://bbs.huaweicloud.com/forum/thread-0290163089973043031-1-1.html 9.sql中的regexp与like区别实现【转】 https://bbs.huaweicloud.com/forum/thread-02127163091329965072-1-1.html 10.SQL多表联查的几种方法示例总结【转】 https://bbs.huaweicloud.com/forum/thread-0234163091395788038-1-1.html 11.redis中如何做到内存优化【转】 https://bbs.huaweicloud.com/forum/thread-02127163091498087074-1-1.html 12.mysql数据库实现超键、候选键、主键与外键的使用【转】 https://bbs.huaweicloud.com/forum/thread-0290163091552614032-1-1.html 13.达梦数据库如何设置自增主键的方法及注意事项【转】 https://bbs.huaweicloud.com/forum/thread-0234163091642509039-1-1.html 14.解决生产环境遇到的curl和yum命令报错问题【转】 https://bbs.huaweicloud.com/forum/thread-0234163091687787040-1-1.html 15.Nginx实现404页面的配置方法的两种方法【转】 https://bbs.huaweicloud.com/forum/thread-0290163091762002033-1-1.html
-
1、超键(Superkey)超键是能唯一确定表中每行数据的属性集。它可以是单个属性或多个属性的组合。示例:一个学生表(Student),包含学号(ID)、姓名(Name)、年龄(Age)和班级(Class)四个字段。其中,学号(ID)单独、姓名+班级(Name+Class)组合,以及学号+姓名+年龄+班级的全集都可以作为超键,因为它们都能唯一标识表中的一行数据。IDNameAgeClass001张三201班002李四212班003王五201班004赵六223班2、候选键(Candidate Key)候选键是最小的超键,即没有任何多余属性的超键。一个表可以有多个候选键。示例:在上表中,如果假设学号(ID)是唯一的,并且没有其他属性与学号组合后还能保持唯一性,那么学号(ID)就是一个候选键。同时,如果姓名+班级的组合在表中也是唯一的(尽管这种情况较少见),那么它也是一个候选键。3、主键(Primary Key)主键是表中的一个特殊候选键,用于唯一标识每行数据。每个表只能有一个主键,且主键的值不能为空。示例:在上表中,我们通常会选择学号(ID)作为主键,因为它能唯一标识每一个学生,并且符合主键的所有要求。4、外键(Foreign Key)外键是表中的一个字段,其值必须是另一个表的主键的值。它用于在两个表之间建立关联,确保数据的参照完整性。示例:假设我们还有一个班级表(Class),其中包含班级ID(ClassID)和班级名称(ClassName)两个字段,且班级ID是主键。在学生表中,我们可以添加一个班级ID(ClassID)字段作为外键,这个字段的值必须对应于班级表中的某个班级ID,从而在学生表和班级表之间建立关联。这样,当我们查询某个学生的信息时,可以通过学生表中的班级ID快速找到该学生所属的班级信息。班级表 (Class)ClassIDClassNameC001一年级1班C002一年级2班C003二年级1班学生表 (Student)IDNameAgeClassID001张三20C001002李四21C002003王五20C001004赵六22C003简洁来说,超键包含候选键,候选键中最常用的是主键,而外键用于表间关联。
-
⚠️ 本人声明:本教程可100%复现网上看了很多Mysql8安装的方式,基本上都是都过一个yum方式直接访问公网下载依赖资源安装的。但是在企业内部一般并不允许生产环境直接连接公网。针对此情况。本文将介绍如何在内网环境下使用二进制安装包本地安装方式来部署Mysql8。使用二进制安装包安装相对编译安装简单快速很多1. 本次实践介绍1.1 本次实践规划本人使用环境如下Mysql8使用二进制安装包安装请尽量保证主机内存大于1G。存储空间大于20G。hostnameIP地址系统版本内核版本master192.168.129.139BigCloud Enterprise Linux For Euler release 21.10 (LTS-SP2)4.19.90-2107.6.0.0100.oe1.bclinux.x86_641.2 本次实践简介1.本次实践环境建议个人测试环境,生产环境请谨慎操作2.本次实践为在在BClinux for euler 21.10下使用rpm包安装Mysql8.3版本3.请尽量保证主机内存大于1G。存储空间大于20G。1.3 二进制安装包安装Mysql的优缺点特点优点缺点安装速度- 快速安装,无需编译- 预编译的包通常为常见配置优化- 可能不是针对特定硬件优化- 不支持某些特殊配置需求兼容性- 适用于多种操作系统版本- 可能与系统上的其他软件包冲突系统资源- 通常占用较少的磁盘空间- 性能可能不如从源代码编译的版本自定义配置- 配置较为简单- 缺乏灵活性,不能在安装过程中进行深度定制更新维护- 更新方便,通常通过包管理器自动更新- 自动更新可能导致服务中断安全性- 可以利用操作系统的安全更新- 可能包含已知但未修复的安全漏洞2. 本地准备环境配置2.1 卸载已经安装的数据库检查linux是否安装了mariadb和mysql数据库,新系统可能会自带mariadb数据库,mariadb数据库是MySQL的分支当一个系统已经安装了MariaDB时,直接尝试安装MySQL可能会导致冲突包依赖冲突:MariaDB和MySQL的某些文件可能具有相同的名称或路径,这会导致包管理器无法正确处理依赖关系。服务冲突:两个数据库服务可能尝试监听相同的端口(通常是3306),这会导致服务启动失败或不稳定。配置冲突:MariaDB和MySQL的配置文件可能位于相同的位置,比如/etc/my.cnf,这会使得配置混乱。# 检查是否安装了mariadbyum list installed | grep mariadb*# 卸载mariadbyum remove mariadb*# 检查是否安装了mysqlyum list installed | grep mysql*# 卸载mysqlyum remove mysql*执行过程如下[root@localhost ~]# yum list installed | grep mariadb*mariadb-connector-c.x86_64 3.0.6-7.oe1 @anaconda[root@localhost ~]# yum remove mariadb*依赖关系解决。=====================================================================================================Package Architecture Version Repository Size=====================================================================================================移除:mariadb-connector-c x86_64 3.0.6-7.oe1 @anaconda 414 k移除依赖的软件包:rsyslog-relp x86_64 8.2006.0-6.oe1 @anaconda 63 krsyslog-help noarch 8.2006.0-6.oe1 @anaconda 7.0 M事务概要=====================================================================================================移除 9 软件包将会释放空间:14 M确定吗?[y/N]: Y运行事务检查事务检查成功。运行事务测试事务测试成功。运行事务准备中 : 1/1运行脚本: rsyslog-relp-8.2006.0-6.oe1.x86_64 1/1删除 : rsyslog-relp-8.2006.0-6.oe1.x86_64 1/9 9/9已移除:libestr-0.1.11-1.oe1.x86_64 libfastjson-0.99.8-3.oe1.x86_64 libnet-1.2-1.oe1.x86_64 librelp-1.2.16-3.oe1.x86_64 mariadb-connector-c-3.0.6-7.oe1.x86_64net-snmp-libs-1:5.9-3.oe1.x86_64 rsyslog-8.2006.0-6.oe1.x86_64 rsyslog-help-8.2006.0-6.oe1.noarch rsyslog-relp-8.2006.0-6.oe1.x86_64完毕![root@localhost ~]# yum list installed | grep mysql*[root@localhost ~]# yum remove mysql*未找到匹配的参数: mysql*没有软件包需要移除。依赖关系解决。无需任何处理。完毕!2.2 配置yum源注释:若Linux主机可以访问公网,则只需要配置好公网repo源即可,若无法连接公网,则需要配置好本地repo源。不同类型用户可能需求不一样。这里默认大家使用本地iso搭建镜像yum源。其余情况请参考文章(已经足够详细)yum源配置,这一篇就够了!(包括本地,网络,本地共享yum源)当服务器无法访问公网或者所需要依赖无法在公网获取,我们可以通过使用挂载本地iso镜像来获取我们需要的rpm包和依赖2.2.1 本机单机yum源配置此处以挂载BClinux for openeuler 21.10镜像为例,每个人操作系统型号不同,请选择自己需要的版本切记选择来源安全可靠的镜像下载将下载好后的镜像上传到/mnt中ls在/mnt目录下创建文件夹 BClinuxmkdir BClinux然后输入下面命令进行挂载mount -o loop /mnt/BCLinux-for-Euler-21.10-everything-x86_64.iso /mnt/BClinux下个步骤中,关闭selinux需要重启,会导致本命令失效,需要重新执行即可2.2.2 repo文件配置进入/etc/yum.repos.d/目录,将之前的repo文件进行备份# 进入repo配置文件cd /etc/yum.repos.d/# 将原来的repo文件进行备份mv /etc/yum.repos.d/* *.bak然后创建新的repo源,输入以下命令# 复制下面的脚本输入echo "> [local]> name=bendiyum> baseurl=file:///mnt/BClinux/> enabled=1> gpgcheck=0" > local.repo## 执行yum clean allyum makecacheyum repolist配置完成yum makecacheyum repolist尝试使用yumyum install -y tree本地yum源配置完成2.3 关闭防火墙和selinux关闭防火墙# 查看防火墙是状态systemctl status firewalld# 关闭防火墙systemctl stop firewalld#取消开机自启动systemctl disable firewalld关闭selinuxsed -i 's/SELINUX\=enforcing/SELINUX\=disabled/g' /etc/selinux/config## 重启后生效3. Mysql安装详解本次香菇安装的Mysql版本为Mysql8.3.03.1 官网下载合适安装包Mysql官网链接:cid:link_1查看本地主机glibc的版本ldd --version根据官网提示信息选择合适的版本下载此处我选择的是mysql-8.3.0-linux-glibc2.28-x86_64.tar.xz版本大家的主机若可以直接访问公网,也可以通过在主机上输入命令的方式下载cd /usr/local/src/ && wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.3.0-linux-glibc2.28-x86_64.tar.xz否则,可以下载到本地,在上传到linux主机对应目录3.2 安装Mysql8.33.2.1 配置安装路径进入Mysql安装包下载的目录,将其移动到/usr/local/src下面mv mysql-8.3.0-linux-glibc2.28-x86_64.tar.xz /usr/local/src/解压文件sudo tar xvJf /usr/local/src/mysql-8.3.0-linux-glibc2.28-x86_64.tar.xz修改文件名称sudo mv mysql-8.3.0-linux-glibc2.28-x86_64 mysql-8.3.0创建mysql相关文件夹sudo mkdir -p /mysql/data # 数据存储sudo mkdir -p /mysql/log # 日志存储sudo mkdir -p /mysql/tmp # 临时文件3.2.2 创建Mysql账户并赋权# 新增主机用户Mysqluseradd -m mysql# 配置密码,此处我设置的密码为Xianggu123echo Xianggu123 | passwd --stdin mysql赋权给Mysql用户mysql安装权限和数据存放路径权限chown -R mysql /usr/local/src/mysql-8.3.0chown -R mysql:mysql /mysql/datachown -R mysql:mysql /mysql/logchown -R mysql:mysql /mysql/tmp3.2.3 安装Mysql在安装目录下执行sudo /usr/local/src/mysql-8.3.0/bin/mysqld --user=mysql --basedir=/usr/local/src/mysql-8.3.0 --datadir=/mysql/data/ --initialize记住初始化密码3.2.4 Mysql配置文件修改正常情况下是没有这个文件的,执行保存之后会自动创建创建并编辑my.cnf文件vi /etc/my.cnf配置文件内容如下(文件路径记得改为自己的)[mysqld]# 设置 MySQL 服务的端口号,默认为 3306port = 3306# 设置 MySQL 服务的安装目录basedir = /usr/local/src/mysql/# 设置 MySQL 数据库的数据存放目录datadir = /mysql/data# 设置允许连接的最大客户端数量max_connections = 200# 设置每个连接使用的缓冲区大小sort_buffer_size = 2Mread_buffer_size = 2Mread_rnd_buffer_size = 8M# 启用查询缓存#query_cache_type = 1#query_cache_size = 16M# 日志相关配置log_error = error.log#slow_query_log = 1#slow_query_log_file = /mysql/log/slow_query.log#long_query_time = 10 # 超过 10 秒的查询被视为慢查询[mysqld]# 设置默认字符集character-set-server = utf8mb4# 设置连接字符集collation-server = utf8mb4_unicode_cisocket=/tmp/mysql.sock[mysqld]# InnoDB 缓冲池大小innodb_buffer_pool_size = 128M# InnoDB 日志文件大小innodb_log_file_size = 64M# InnoDB 日志文件数量innodb_log_files_in_group = 2# InnoDB 自动扩展表空间innodb_autoextend_increment = 64M3.2.5 将mysql注册为系统服务sudo cp -a /usr/local/src/mysql-8.3.0/support-files/mysql.server /usr/lib/systemd/systemchown 775 /usr/lib/systemd/system/mysql.server# 设置启动mysqlsystemctl start mysql# 设置开机自动启动systemctl enable mysql3.2.6 将Mysql添加到系统环境变量中# 编辑文件vi /etc/profile# 在末尾添加下面内容export PATH=$PATH:/usr/local/src/mysql/bin4. Mysql服务初始化配置4.1 初始化Mysql首先将mysql相关路径的权限赋给mysql主机用户chown -R mysql:mysql /mysql启动Mysql服务systemctl start mysql查看mysql状态systemctl status mysql进入mysql主机用户,登录mysql# 切换到mysql用户su - mysql# 登录mysqlmysql -uroot -p更改初始密码#我这里改成了Xianggu@123ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Xianggu@123';flush privileges;设置允许远程登录use mysql;# 允许所有主机登录rootupdate user set host="%" where user='root'flush privileges;4.2 远程连接测试选择一个常用的数据库登录工具,此处我用的是VScode可以看到已经连接成功编写sql语句进行测试create database xianggu;use xianggu;create table student (name varchar(50),age int,id int);5.总结经过一系列的操作,我们成功地在内网环境中使用二进制安装包完成了 MySQL 8.3 版本的安装和基本配置。通过本教程,您应该能够了解如何在没有公网访问的情况下进行 MySQL 的安装,这对于企业内部的部署来说非常实用。安装步骤回顾:环境准备:确认系统内存和存储空间满足要求,确保主机至少有 1GB 的内存和 20GB 的存储空间。卸载旧版数据库:避免与已安装的 MariaDB 或 MySQL 发生冲突。配置本地 yum 源:如果服务器无法访问公网,可以使用本地 ISO 镜像作为 yum 源来获取所需的 RPM 包和依赖。安装 MySQL:下载并解压 MySQL 的二进制安装包,创建必要的文件夹,创建 MySQL 用户并赋予相应的权限。初始化 MySQL 服务:通过指定用户、安装目录和数据目录等参数初始化 MySQL 服务,并记录生成的初始密码。配置 MySQL:创建并编辑 my.cnf 文件,对 MySQL 进行必要的配置,如端口、数据目录、最大连接数等。注册为系统服务:将 MySQL 注册为系统服务,并设置开机自启。环境变量配置:将 MySQL 的二进制路径添加到系统环境变量中。服务初始化:设置初始密码,开启远程连接功能,并启动 MySQL 服务。使用二进制安装包安装 MySQL 是一种快速简便的方法,特别适合于那些无法直接连接公网的内网环境。这种方式不仅简化了安装流程,还减少了编译的时间。通过以上步骤,您可以轻松地在 BigCloud Enterprise Linux For Euler 21.10 上安装并配置 MySQL 8.3 版本,从而满足您的数据库需求。
-
下面针对一些参数进行说明,当然还有其它的设置可以起作用,取决于你的负载或硬件:在慢内存和快磁盘、高并发和写密集型负载情况下,你将需要特殊的调整前言日常的MySQL运维中说起调优,MySQL的配置文件my.cnf是不可忽略的。MySQL的默认参数并不能满足我们日常线上业务的需求,因此对参数进行优化也是不可缺少的环节。这里不想列出my.cnf配置中有多少项和每一项的意思,这些都可以在官方文档上查到。以下仅对日常工作用应该注意的一些参数进行说明。下面针对一些参数进行说明。当然还有其它的设置可以起作用,取决于你的负载或硬件:在慢内存和快磁盘、高并发和写密集型负载情况下,你将需要特殊的调整。然而这里的目标是让你可以快速地获得一个稳健的MySQL配置,而不用花费太多时间在调整一些无关紧要的MySQL设置或读文档,找出哪些设置对你来说是重要的。InnoDB配置从MySQL 5.5版本开始,InnoDB就是默认的存储引擎并且它比任何其它存储引擎的使用要多得多。那也是为什么它需要小心配置的原因。innodb_file_per_table表的数据和索引存放在共享表空间里或者单独表空间里。我们的工作场景安装是默认设置了innodb_file_per_table = ON,这样也有助于工作中进行单独表空间的迁移工作。MySQL 5.6中,这个属性默认值是ON。_flush_log_at_trx_commit默认值为1,表示InnoDB完全支持ACID特性。当你的主要关注点是数据安全的时候这个值是最合适的,比如在一个主节点上。但是对于磁盘(读写)速度较慢的系统,它会带来很巨大的开销,因为每次将改变flush到redo日志都需要额外的fsyncs。如果将它的值设置为2会导致不太可靠(unreliable)。因为提交的事务仅仅每秒才flush一次到redo日志,但对于一些场景是可以接受的,比如对于主节点的备份节点这个值是可以接受的。如果值为0速度就更快了,但在系统崩溃时可能丢失一些数据:只适用于备份节点。说到这个参数就一定会想到另一个sync_binlog。innodb_flush_method这项配置决定了数据和日志写入硬盘的方式。一共有三种方式,我们默认使用O_DIRECT 。O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,而真正的完成也是在flush这步,日志还是要经过OS缓冲。innodb_log_buffer_size这项配置决定了为尚未执行的事务分配的缓存。其默认值(1MB)一般来说已经够用了,但是如果你的事务中包含有二进制大对象或者大文本字段的话,这点缓存很快就会被填满并触发额外的I/O操作。看看Innodb_log_waits状态变量,如果它不是0,增加innodb_log_buffer_size。innodb_buffer_pool_size这个参数应该是运维中必须关注的了。缓冲池是数据和索引缓存的地方,它属于MySQL的核心参数,默认为128MB,正常的情况下这个参数设置为物理内存的60%~70%。(不过我们的实例基本上都是多实例混部的,所以这个值还要根据业务规模来具体分析。)innodb_log_file_size这是redo日志的大小。redo日志被用于确保写操作快速而可靠并且在崩溃时恢复。如果你知道你的应用程序需要频繁地写入数据并且你使用的是MySQL 5.6,那么你可以一开始就把它这是成4G。(具体大小还要根据自身业务进行适当调整)innodb_support_xainnodb_support_xa可以开关InnoDB的XA两段式事务提交。默认情况下,innodb_support_xa=true,支持XA两段式事务提交。由于XA两段式事务提交导致多余flush等操作,性能影响会达到10%,所有为了提高性能,有些DBA会设置innodb_support_xa=false。这样的话,redolog和binlog将无法同步,可能存在事务在主库提交,但是没有记录到binlog的情况。这样也有可能造成事务数据的丢失。innodb_additional_mem_pool_size该参数用来存储数据字段信息和其他内部数据结构。表越多,需要在这里分配的内存越多。如果InnoDB用光了这个池内的内存,InnoDB开始从操作系统分配内存,并且往MySQL错误日志写警告信息,默认8MB。一般设置16MB。max_connectionsMySQL服务器默认连接数比较小,一般也就100来个最好把最大值设大一些。一般设置500~1000即可每一个链接都会占用一定的内存,所以这个参数也不是越大越好。有的人遇到too many connections会去增加这个参数的大小,但其实如果是业务量或者程序逻辑有问题或者sql写的不好,即使增大这个参数也无济于事,再次报错只是时间问题。在应用程序里使用连接池或者在MySQL里使用进程池有助于解决这一问题。Seesion级的内存分配123456789101112max_threads(当前活跃连接数)* (read_buffer_size– 顺序读缓冲,提高顺序读效率+read_rnd_buffer_size– 随机读缓冲,提高随机读效率+sort_buffer_size– 排序缓冲,提高排序效率+join_buffer_size– 表连接缓冲,提高表连接效率+binlog_cache_size– 二进制日志缓冲,提高二进制日志写入效率ß+tmp_table_size– 内存临时表,提高临时表存储效率+thread_stack– 线程堆栈,暂时寄存SQL语句/存储过程+thread_cache_size– 线程缓存,降低多次反复打开线程开销+net_buffer_length– 线程持连接缓冲以及读取结果缓冲+bulk_insert_buffer_size– MyISAM表批量写入数据缓冲)global级的内存分配12345678910111213global buffer(全局内存分配总和) =innodb_buffer_pool_size— InnoDB高速缓冲,行数据、索引缓冲,以及事务锁、自适应哈希等+ innodb_additional_mem_pool_size— InnoDB数据字典额外内存,缓存所有表数据字典+innodb_log_buffer_size— InnoDB REDO日志缓冲,提高REDO日志写入效率+key_buffer_size— MyISAM表索引高速缓冲,提高MyISAM表索引读写效率+query_cache_size–查询高速缓存,缓存查询结果,提高反复查询返回效率+table_cahce — 表空间文件描述符缓存,提高数据表打开效率+table_definition_cache–表定义文件描述符缓存,提高数据表打开效率参数的优化最终目的是让MySQL更好地利用资源通过合理地控制内存的分配,合理的CPU使用建议降低Session的内存分配。server-id复制架构时确保 server-id 要不同,通常主ID要小于从ID。log_bin如果你想让数据库服务器充当主节点的备份节点,那么开启二进制日志是必须的。如果这么做了之后,还别忘了设置server_id为一个唯一的值。就算只有一个服务器,如果你想做基于时间点的数据恢复,这(开启二进制日志)也是很有用的:从你最近的备份中恢复(全量备份),并应用二进制日志中的修改(增量备份)。二进制日志一旦创建就将永久保存。所以如果你不想让磁盘空间耗尽,你可以用 PURGE BINARY LOGS 来清除旧文件,或者设置expire_logs_days 来指定过多少天日志将被自动清除。记录二进制日志不是没有开销的,所以如果你在一个非主节点的复制节点上不需要它的话,那么建议关闭这个选项。skip_name_resolve当客户端连接数据库服务器时,服务器会进行主机名解析,并且当DNS很慢时,建立连接也会很慢。因此建议在启动服务器时关闭skip_name_resolve选项而不进行DNS查找。唯一的局限是之后GRANT语句中只能使用IP地址了,因此在添加这项设置到一个已有系统中必须格外小心。sync_binlogsync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。当sync_binlog =N (N>0) ,MySQL 在每写N次二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。当innodb_flush_log_at_trx_commit和sync_binlog 都为 1 时是最安全的,在mysqld服务崩溃或者服务器主机crash的情况下,binary log只有可能丢失最多一个语句或者一个事务。但是鱼与熊掌不可兼得,双1会导致频繁的IO操作,因此该模式也是最慢的一种方式。出于我们的业务考虑在业务压力允许的情况下默认的都是双1配置。log_slave_update当业务中需要使用级联架构的时候log_slave_update = 1这个参数必须打开,否者第三级可能无法接收到第一级产生的binlog,从而无法进行数据同步。tmpdir如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下.因此尽可能将tmpdir配置到性能好速度快的存储设备上。慢日志相关slow_query_log = 1 #打开慢日志slow_query_log_file = /mysql/log/mysql.slowlong_query_time = 0.5 #设置超过多少秒的查询会入慢日志其他问题SSD对参数的影响随着科学技术的发展,越来越多的存储设备开始由传统的机械组件转向由电子元件组成的永久存储,且价钱越来越能让企业接受。存储组件速度提升后,再用传统机械组件的DB配置就显得浪费了,所以就需要针对不同的存储技术对MySQL配置作出调整,比如 innodb_io_capacity需要调大, 日志文件和redo放到机械硬盘, undo放到SSD, atomic write不需要Double Write Buffer, InnoDB压缩, 单机多实例+cgroup等等。分析 I/O 情况,动态调整 innodb_io_capacity 和 innodb_max_dirty_pages_pct;试图调整 innodb_adaptive_flushing,查看效果。线程池设置针对innodb_write_io_threads 和 innodb_read_io_threads 的调优我们目前没有做,但我相信调整为8或者16,系统 I/O 性能会更好。还有,需要注意以下几点:任何一个调整,都要建立在数据的支撑和严谨的分析基础上,否则都是空谈; 这类调优是非常有意义的,是真正能带来价值的,所以需要多下功夫,并且尽可能地搞明白为什么要这么调整。CPU相关Innodb_thread_concurrency=0Innodb_sync_spin_loops=288table_definition_cache=2000IO相关的Innodb_flush_method 建议用O_DIRECTInnodb_io_capacity 设置成磁盘支持最大IOPSInnodb_wirte_io_threads=8Innodb_read_io_threads=8Innodb_purge_threads=1Innodb的预读方面,如果基于主建或是唯一索引的系统,建议禁用预读Innodb_random_read_ahead = off
-
当mysql CPU告警利用率过高的时候,我们应该怎么定位是哪些SQL导致的呢,本文将介绍一下定位的方法,文章通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下前言当mysql CPU告警利用率过高的时候,我们应该怎么定位是哪些SQL导致的呢,本文将介绍一下定位的方法。本文所使用的方法,前提是你可以登录到Mysql所在的服务器,执行命令查看进程,当然让数据库管理员登录执行也可以。但如果无法或无权限去服务器上执行命令,本方法将不适合定位问题。一.获取Mysql的服务器进程号登陆mysql所在的Linux服务器,执行命令:top,在COMMAND列找到mysqld,并且%CPU使用率高的,比如数值超过100的,获取PID号。12PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND32232 root 20 0 1443252 356688 11748 S 107.0 4.4 2:03.82 mysqld 上述例子中,32232为mysql进程ID,接下来再用它查询出占用CPU多的线程。二.查询进程中的线程使用命令:top -H -p <mysqld 进程 id>,查询线程号:本例中使用命令top -H -p 3223212PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 32272 root 20 0 1443252 356688 11748 R 99.7 4.4 2:25.74 mysqld 其中PID 32272为线程id号。三.根据线程ID去mysql查询出对应的SQL1select a.user,a.host,a.db,b.thread_os_id,b.thread_id,a.id processlist_id,a.command,a.time,a.state,a.info from information_schema.processlist a,performance_schema.threads b where a.id = b.processlist_id and b.thread_os_id=32272;查询结果:1234| user | host | db | thread_os_id | thread_id | processlist_id | command | time | state | info |+----------+-----------+------+--------------+-----------+----------------+---------+------+--------------+---------------------------------------------+| msandbox | localhost | test | 32272 | 32 | 7 | Query | 2 | Sending data | select * from t_abc order by rand() limit 1 |+----------+-----------+------+--------------+-----------+----------------+---------+------+--------------+---------------------------------------------+复制讲解AI对话其中,info列显示的SQL就是占用CPU较大的SQL,针对其进行优化即可。此外,还可以通过下列SQL,查询下线程的其他信息,方便进一步优化:1select * from performance_schema.events_statements_current where thread_id in (select thread_id from performance_schema.threads where thread_os_id = 32272)通过这个结果我们可以查看具体的 SQL,看到有使用临时表、使用了排序等信息。查询结果节选:1234CREATED_TMP_DISK_TABLES: 1 CREATED_TMP_TABLES: 1 SORT_ROWS: 1 SORT_SCAN: 1
-
一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇文章了,下面这篇文章主要给大家介绍了关于MySql一条查询语句的执行流程究竟是怎么样的,需要的朋友可以参考下1.前言一条sql语句到底在执行时经历了什么?探究这个问题是学习mysql的重要步骤,面试时常被问到,也使得学习mysql时也有了知识框架的支撑,明白我们背的知识点到底用在哪里,笔者觉得这一点还是很重要的。注:对一个知识点的总结不仅包含知识点本身,还包含对该知识点的联想,这个联想是在面试时可能被追问的,也可以自己主动说出来(我还知道。。。)加分的。2.知识点MySQL 执行流程是怎样的?首先要知道的是,我们可以把mysql分成两层,server层和数据库引擎层,前者主要是对我们的查询进行处理(主要包括 {连接器},{查询缓存}、{解析器}、{预处理器、优化器、执行器} 等),后者是数据真正存储的地方(从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎)。一条查询的执行流程如下:第一步:通过连接器连接 MySQL 服务1mysql -h$ip -u$user -p[连接器联想1]: 连接经过TCP 三次握手,断开经过四次挥手[连接器联想2]: 如果用户密码都没有问题,连接器就会获取该用户的权限,然后保存起来,后续该用户在此连接里的任何操作,都会基于连接开始时读到的权限进行权限逻辑的判断,意思是管理员修改已登录用户的权限需要等他重新登录才生效[连接器联想3]: 如何查看 MySQL 服务被多少个客户端连接了?show processlist[连接器联想4]: 空闲连接会一直占用着吗?MySQL 定义了空闲连接的最大空闲时长,由 wait_timeout 参数控制的,默认值是 8 小时(28880秒),如果空闲连接超过了这个时间,连接器就会自动将它断开。[连接器联想5]: MySQL 的连接数有限制吗?最大连接数由 max_connections 参数控制,超过这个值,系统就会拒绝接下来的连接请求,并报错提示“Too many connections”。[连接器联想6]: 怎么解决长连接占用内存的问题?MySQL 的连接也跟 HTTP 一样,有短连接和长连接的概念,长连接的好处就是可以减少建立连接和断开连接的过程,但是,使用长连接后可能会占用内存增多,因为 MySQL 在执行查询过程中临时使用内存管理连接对象,这些连接对象资源只有在连接断开时才会释放。有两种解决方式。第一种,定期断开长连接。第二种,客户端主动重置连接。MySQL 5.7 版本实现了 mysql_reset_connection() 函数的接口来重置连接,达到释放内存的效果。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。[连接器联想7]: 连接器的工作?与客户端进行 TCP 三次握手建立连接;校验客户端的用户名和密码,如果用户名或密码不对,则会报错;如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读取到的权限;第二步:查询缓存连接器得工作完成后,客户端就可以向 MySQL 服务发送 SQL 语句了,MySQL 服务收到 SQL 语句后,就会解析出 SQL 语句的第一个字段,看看是什么类型的语句。如果 SQL 是查询语句(select 语句),MySQL 就会先去查询缓存( Query Cache )里查找缓存数据。但是其实查询缓存挺鸡肋的。对于更新比较频繁的表,查询缓存的命中率很低的,因为只要一个表有更新操作,那么这个表的查询缓存就会被清空。所以,MySQL 8.0 版本直接将server层查询缓存删掉了。第三步:解析SQL在正式执行 SQL 查询语句之前, MySQL 会先对 SQL 语句做解析,这个工作交由「解析器」来完成。解析器会做两件事情:词法分析、 语法分析。[解释器联想1]: 词法分析:MySQL 会根据你输入的字符串识别出关键字出来,例如,SQL语句 select username from userinfo,在分析之后,会得到4个Token,其中有2个Keyword,分别为select和from.[解释器联想2]: 语法分析:根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法,如果没问题就会构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。[解释器联想3]: 解如果我们输入的 SQL 语句语法不对,就会在解析器这个阶段报错。(释器的主要作用)[解释器联想4]: 解释器只负责检查语法和构建语法树,但是不会去查表或者字段存不存在。第四步:执行 SQL解析SQL无误后,执行SQL需要经过三个步骤:预处理器、优化器、执行器。预处理器检查 SQL 查询语句中的表或者字段是否存在;将 select * 中的 * 符号,扩展为表上的所有列;优化器优化器主要负责将 SQL 查询语句的执行计划确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。[优化器联想1]: 要想知道优化器选择了哪个索引,我们可以在查询语句最前面加个 explain 命令,这样就会输出这条 SQL 语句的执行计划。explain select * from product where id = 1[优化器联想2]: 一般来讲普通索引查询效率高于主键索引,当索引覆盖时会先考虑普通索引的B+树上查询,这就是执行计划,是优化器决定的。执行器确定了执行计划,接下来 MySQL 就真正开始执行语句了,在执行的过程中,执行器就会和存储引擎交互了,交互是以记录为单位的。主键索引查询 select * from product where id = 1; 让InnoDB引擎通过主键索引B+树搜索id=1的记录。全表扫描 select * from product where name = 'iphone'; 查询条件没有用到索引,触发全表扫描,查询每一条记录判断是否满足条件。索引下推 (MySQL 5.6 推出的查询优化策略)[索引下推联想1]: 索引下推能够减少二级索引在查询时的回表操作,提高查询的效率,因为它将 Server 层部分负责的事情,交给存储引擎层去处理了。select * from t_user where age > 20 and reward = 100000;不使用索引下推(MySQL 5.6 之前的版本)时,定位到 age > 20 的一条记录,获取主键值,然后进行回表操作,将完整的记录返回给 Server 层,Server 层再判断该记录的 reward 是否等于 100000。而使用索引下推后,判断记录的 reward 是否等于 100000 的工作交给了存储引擎层:定位到 age > 20 的第一条记录,存储引擎定位到二级索引后,先不执行回表操作,而是先判断一下该索引中包含的列(reward列)的条件(reward 是否等于 100000)是否成立。如果条件不成立,则直接跳过该二级索引。如果成立,则执行回表操作,将完成记录返回给 Server 层。MySQL 执行流程是怎样的?总结:(总结只是简单总结,也就是被问到时该说的,上面的知识点,是可能被追问时涉及的,或者自己说出来的加分项。)连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;
推荐直播
-
华为AI技术发展与挑战:集成需求分析的实战指南
2024/11/26 周二 18:20-20:20
Alex 华为云学堂技术讲师
本期直播将综合讨论华为AI技术的发展现状,技术挑战,并深入探讨华为AI应用开发过程中的需求分析过程,从理论到实践帮助开发者快速掌握华为AI应用集成需求的框架和方法。
去报名 -
华为云DataArts+DWS助力企业数据治理一站式解决方案及应用实践
2024/11/27 周三 16:30-18:00
Walter.chi 华为云数据治理DTSE技术布道师
想知道数据治理项目中,数据主题域如何合理划分?数据标准及主数据标准如何制定?数仓分层模型如何合理规划?华为云DataArts+DWS助力企业数据治理项目一站式解决方案和应用实践告诉您答案!本期将从数据趋势、数据治理方案、数据治理规划及落地,案例分享四个方面来助力企业数据治理项目合理咨询规划及顺利实施。
去报名
热门标签