尧图精选

从零上手MySQL:安装配置、SQL操作、连接池与实战排错路线

🕒 发布时间:2026/10/1 18:06:44 📁 来源:尧图网络
搞技术的几乎都绕不开“数据库”这三个字。前端要调接口后端要写SQL运维要盯实例连测试做数据构造也得会几条增删改查。标题里的“初步了解数据库MySQL”听起来确实很基础但很多人就是卡在基础这一步概念看了不少一动手连MySQL都装不明白。这篇内容相当于我平时带人走的一条完整路线从安装配置、SQL常用操作到连接池、数据同步、项目场景与排错全部串起来讲一遍。我的做法是每个操作都尽量说清楚“为什么这么干”而不是只丢一条命令。数据库知识最忌讳的就是背概念。你就算能把“事务的ACID特性”背得一字不差真到线上要处理一条慢SQL还是不知道从哪下手。所以建议直接跟着MySQL动手把一个本地实例跑起来边操作边理解库、表、字段、索引、主键这些词的实际含义。后面每个章节的内容都建立在“你有一个能正常使用的MySQL”这个前提上所以第二部分的环境准备别跳过。1. 数据库到底在解决什么问题1.1 先搞懂行、列、表和主键的关系很多人第一次听“数据库”下意识以为是很玄的东西。其实可以把它理解成一张规则更严格的Excel表一个工作表是一张数据表最上面一行是字段名下面的每一行是一条记录。MySQL里的表本质上也是这个结构只不过它严格规定了每一列的数据类型、是否允许为空、是否唯一并且通过索引让查询变快。这里有几个高频概念我按实际使用频率排个序表table、字段column、记录row、主键primary key、索引index、事务transaction。主键就是每条记录的唯一编号就像每辆车的车牌号不能重复也不能为空。索引的目的单纯是为了加速查找好比书的目录页但索引会占磁盘空间写数据时也有额外开销所以不能无脑加。事务则用来保证多步操作的一致性比如转账时“扣钱”和“加钱”必须同时成功或者同时失败不能只做一半。把上面这些串起来就是数据库基础知识的核心。接到一个新需求时先别急着写代码建议先画一个表结构清单哪些业务对象需要单独建表表和表之间怎么关联哪些字段需要唯一约束哪个字段做主键。这个步骤想得越清楚后面写增删改查越不容易返工。我在项目里见过太多因为前期表设计拍脑袋后期上线一个月就不断改字段结构的情况代价远比你想象的贵。1.2 为什么新手和老手都常选 MySQL市面上的数据库非常多MySQL、Oracle、SQL Server、PostgreSQL、SQLite还有达梦、GBase这类自有品牌的数据库。对刚接触的人来说选MySQL作为第一个学习对象几乎是性价比最高的决定。数据库开源安装难度常见场景学习门槛MySQL是低Web应用、中小型系统低MariaDB是低与MySQL兼容的分支低PostgreSQL是中数据严谨性要求高的系统中Oracle否高大型传统企业系统高SQL Server否中Windows生态企业系统中SQLite是极低单机、移动端、嵌入式极低达梦/GBase部分中政企、特定行业项目中选择MySQL有几个很现实的原因。第一它免费开源能随便装在自己电脑上折腾不像某些商业数据库装个测试版还要申请授权。第二社区资料量巨大报错信息一搜基本都有前人踩过坑这对新手极其友好。第三它和Java、PHP、Python这几种后端语言配合非常成熟JDBC驱动、ORM框架、容器镜像全都是现成的。很多小型公司的生产环境MySQLRedis组合就够支撑相当体量的业务。但也要知道它的边界。如果业务写着写着发现并发量极高或者主要保存的是物联网设备不断上报的时序数据这时候就需要引入其他数据库来解决特定问题。我后面会单独讲一下时序数据库TDengine就是想让大家明白没有万能数据库只有合适的工具。2. 把 MySQL 跑起来安装与配置2.1 Windows 下安装 MySQL 8 的完整路线在Windows上装MySQL最简单的办法是去官方下载MySQL Installer。搜索引擎里搜“mysql 下载官网”会出来一堆第三方站点有些还夹带私货所以认准dev.mysql.com/downloads/就好社区版Community Server免费足够学习和生产小规模使用。安装过程有几个关键选择我说一下实际经验安装包类型选Developer Default也可以只选Server Only默认会带MySQL Workbench和Shell先保留这些工具省得后面还要补。到了“Type and Networking”页面默认端口3306不要随便改。除非你已经装了其他数据库占用了端口否则保持默认后续所有连接串、工具配置都按3306来。Authentication Method选择“Use Strong Password Encryption”默认的caching_sha2_password。如果公司里有用老版本客户端再考虑切到mysql_native_password否则容易遇到认证插件不兼容的问题。设置root密码后别忘了在“Windows Service”环节勾选“Start at System Startup”不然重启电脑后MySQL服务不会自动跑起来。安装完成后打开命令提示符执行mysql -uroot -p输入密码能进到mysql交互界面就说明装好了。顺手执行一句SELECT VERSION();能看到8.0.x版本号。这句话以后会是排查问题的一把钥匙很多异常看起来是网络问题最后查出来是应用连到了错误版本或错误节点的MySQL。2.2 Linux 下 RPM 安装和离线安装真正的工作环境更多是LinuxCentOS、Ubuntu这类系统。以RHEL系为例官方提供了yum源安装包文件名通常是mysql80-community-release-el9-*.rpm这类。先下载对应的rpm包然后安装并启用MySQL的源再执行yum install mysql-community-server依赖会自动解决。这个方法适合服务器能联网的情况。但内网环境还有另一种常见需求离线安装。你得在一台可以联网的机器上把mysql-community-common、mysql-community-client、mysql-community-server等几个rpm包全部下载下来拷到目标机器后执行rpm -ivh mysql-community-common-*.rpm rpm -ivh mysql-community-client-plugins-*.rpm rpm -ivh mysql-community-libs-*.rpm rpm -ivh mysql-community-client-*.rpm rpm -ivh mysql-community-server-*.rpm依赖顺序不能乱先公共、再客户端、最后服务端。很多人图省事直接rpm -ivh mysql-community-*.rpm一起装运气好能成运气不好会遇到依赖冲突。更稳的做法是yum localinstall mysql-community-*.rpm让yum帮你解决依赖。装好之后初始化是个容易踩坑的点mysqld --initialize --usermysql systemctl start mysqld grep temporary password /var/log/mysqld.log临时密码就在这行日志里。第一次登录会强制你修改密码ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword123!;我在装监控系统时比如CentOS 9部署Zabbix 7.0 LTS后端用的就是MySQL 8.0。这类场景下不仅要装库还要额外建好zabbix库并授权。养成看日志的习惯比盲目重启服务管用得多。MySQL的错误日志默认在/var/log/mysqld.log很多启动失败的根因都在里面。2.3 安装过程中几个高频报错及排查方向新手在安装阶段最容易心态炸裂。我把自己实际遇到过的几个报错整理一下报错原文不完全一样但排查方向是一致的。报错或症状常见原因快速处置思路Windows服务启动失败事件查看器报e0434352.NET Framework或VC运行库异常重装VC Redistributable、修复.NET Framework提示找不到数据库引擎启动句柄mysqld未正确初始化或服务路径指向错误检查服务属性中的可执行文件路径重新执行mysqld --initializeMySQL Workbench闪退或报e0434352图形工具依赖组件损坏更新显卡驱动、重装Workbench或换用命令行客户端执行EXCEL导入时报64位引擎不支持当前数据源缺少64位Access Database Engine驱动安装64位ACE驱动并在导入向导里选择正确的连接方式客户端连接时报SSL connection error认证插件或SSL证书配置不一致连接串中配置useSSL或是使用兼容新认证的客户端版本先说e0434352这串编码很多人见到就慌。它本质上是.NET运行时抛出的异常经常体现为一个Windows程序瞬间崩溃。MySQL相关的图形工具或者服务出现这个错第一反应应该是检查VC运行库是否完整尤其刚重装过系统的机器缺失运行库的概率很高。不要一上来就反复重装MySQL装到怀疑人生也没用。再比如“找不到数据库引擎启动句柄”这句话很容易让人以为是MySQL找不到什么系统句柄其实多数情况下是MySQL服务还没初始化成功或服务里配置的路径和实际安装路径不一致。Windows服务管理器里看“可执行文件的路径”是否包含mysqld.exe再把data目录清掉重新初始化一遍一般就能解决。总之一句话安装遇到问题先看日志服务类问题看系统事件查看器数据库类问题看MySQL错误日志比到处搜碎片答案更高效。3. SQL 常用操作增删改查与进阶3.1 把增删改查练熟就拿到了数据库的钥匙不管MySQL埋了多少新特性日常开发用得最多的始终是增删改查也就是常说的CRUD。先建一张用户表示范一下基本操作CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, phone VARCHAR(20) UNIQUE, age INT DEFAULT 18, created_at DATETIME DEFAULT CURRENT_TIMESTAMP );这张表里用上了几个最常见的约束PRIMARY KEY保证主键唯一NOT NULL说明字段不能为空UNIQUE防止手机号重复DEFAULT给字段默认值。然后往里插几条数据INSERT INTO user (name, phone, age) VALUES (张三, 13800000001, 25);查询时最常用的是带过滤条件的写法SELECT id, name, age FROM user WHERE age 20 ORDER BY id DESC LIMIT 10;这条语句虽然只有一行但包含了执行顺序的问题先通过WHERE过滤再排序最后取前10条。理解这个顺序对排查慢查询非常重要有时候你发现LIMIT失效就是因为SQL写成先排序后过滤排序过程把数据库拖垮了。更新和删除也要注意范围UPDATE user SET age 26 WHERE id 1; DELETE FROM user WHERE id 1;写这两类语句时我的习惯是先跑一遍SELECT看看影响多少行再用UPDATE或DELETE去执行。尤其是线上环境一次忘记加WHERE的UPDATE能把整张表的数据全改掉。如果MySQL允许还应该把这类危险操作放到事务里START TRANSACTION; UPDATE ... ROLLBACK; -- 或者 COMMIT;事务的好处就是“做错了能反悔”。在还没COMMIT之前执行ROLLBACK可以全部撤销。这个习惯一旦养成能帮你躲过不少生产事故。3.2 排序、默认值、字符串转日期等容易踩坑的写法接着往下走有几个书写习惯我想拿出来单独说。第一个是排序SELECT * FROM user ORDER BY age DESC, id ASC;如果只按一个字段排序当age相同的时候行的顺序是不可预期的。所以需要次要排序条件来保证结果稳定。还有一个细节是NULL值排序默认在升序时排最前如果你想让它沉底可以加ORDER BY (age IS NULL) ASC, age ASC。第二个是设置默认值为0。比如用户积分ALTER TABLE user ADD COLUMN points INT NOT NULL DEFAULT 0;默认值的作用不只是插入时省参数更重要的是保证历史数据不会因为新字段而报错。如果表里已经有几百行记录新增字段时不给默认值MySQL会要求你填一个否则语句会执行失败。第三个高频需求是把字符串转成日期。Java后端传过来的参数经常是2024-05-01 10:30:00这种字符串直接用字符串比较出错的概率很大。正确的转换方式SELECT STR_TO_DATE(2024-05-01 10:30:00, %Y-%m-%d %H:%i:%s);反过来把日期转成指定格式用DATE_FORMATSELECT DATE_FORMAT(now(), %Y年%m月%d日);MySQL的日期有多少种格式我不想在这里全部列出来但格式符%Y是四位年%y是两位年%m是两位月%d是两位日%H是24小时制小时这个几个最常用背下来足够应付大部分场景。很多人遇到字符串和日期比较的诡异结果基本都是因为隐式转换。MySQL会自动尝试把字符串转数字或日期一旦转换失败就会变成全表扫描慢得没眼看。所以能用显式转换的尽量别依赖隐式转换。第四个是修改表结构。开发过程中改字段简直是家常便饭常用三条命令ALTER TABLE user ADD COLUMN email VARCHAR(100) DEFAULT NULL; ALTER TABLE user MODIFY COLUMN email VARCHAR(150) DEFAULT NULL; ALTER TABLE user CHANGE COLUMN email contact_email VARCHAR(150) DEFAULT NULL;ADD是新增字段MODIFY是修改字段属性和默认值CHANGE可以连同字段名一起改。还有一种是修改字段注释MySQL和GBase这类数据库的写法类似ALTER TABLE user MODIFY COLUMN email VARCHAR(150) COMMENT 联系邮箱;这里的注释不是可有可无的东西。等表结构越来越复杂几个字段都有特殊含义时一份好的注释能省下大量沟通成本。我在项目评审时经常看到有人建表不带注释半年后自己都看不懂字段含义。记住表结构注释是写给未来的人看的包括未来的你自己。3.3 存储过程熟悉语法但不过度使用存储过程在MySQL里的角色有点微妙。老项目里大量使用新项目反而不太推荐。但作为入门者至少要看懂它因为研究老系统或者做数据抽数脚本时必定会碰到。一个最简单的存储过程示例DELIMITER // CREATE PROCEDURE count_user(OUT total INT) BEGIN SELECT COUNT(*) INTO total FROM user; END // DELIMITER ; CALL count_user(n); SELECT n;执行原理不复杂DELIMITER //是临时把语句结束符改成//否则MySQL遇到分号就以为整个定义结束了OUT表示输出参数CALL负责调用。还有带输入参数的写法CREATE PROCEDURE get_user_by_id(IN uid INT) BEGIN SELECT * FROM user WHERE id uid; END;存储过程把一段逻辑封装在数据库内部确实能给应用层减负但它的问题也很明显不好调试、不好做版本管理、逻辑和业务代码分离后很容易失守。我见过的团队一般只在两种地方保留存储过程一种是报表计算和复杂的数仓加工另一种是老的ERP系统接口。大部分JavaWeb项目用ORM框架直接执行SQL够用了。如果你非要在自己负责的项目里写存储过程我的建议是控制长度。一个存储过程超过几百行基本就失去可维护性了。你可以把它当成学习数据库逻辑的好工具但别把核心业务全部压在上面。4. 客户端工具、连接池与数据流转4.1 数据库客户端工具怎么选环境搭好、SQL会写了接下来是连接数据库的工具选择。MySQL自带的Workbench能用但用起来不算顺手。现在各团队用得比较多的客户端大概有几类我列一下适合的场景。Navicat系列是很多人的首选图形化程度高建库、导数据、备份都直观。它能连接MySQL、Oracle、SQL Server、达梦等等不需要每换一种数据库就学一个新工具。连接达梦数据库时只要注意驱动文件和端口5236就行整体体验和连MySQL差别不大。需要注意一点Navicat是商业软件学习用途完全可以用官方的试用版或者换成开源工具没必要在搜索引擎里找破解版。如果你喜欢免费开源的DBeaver社区版是一个很稳的选择。它支持几十种数据库包括SQLite、Oracle、MySQL统一管理很方便。还有一个轻量级工具叫DB Browser for SQLite是专门用来打开SQLite文件的。很多人拿到一个.db或.sqlite后缀的文件不知道用什么打开其实不需要装数据库服务下载DB Browser for SQLite直接打开就能看到里面的表和数据。工具方面有一个经验不要同时开三四个客户端。每多一个客户端就意味着多一套连接配置、多一个认证插件兼容性问题排查问题时反而分散精力。我自己的组合是日常开发用一个支持多源的工具比如DBeaver需要做复杂导入导出时再用Navicat。这样覆盖度已经足够。4.2 连接池到底解决了什么问题你有没有想过为什么项目里很少直接用JDBC的DriverManager.getConnection()去连数据库因为每次创建和销毁连接都是一个重操作握手、认证、分配资源几百个请求打进来就能把数据库拖死。连接池的思路很朴素预先创建一批连接放在池子里请求来了借走一个用完再放回去。以Java生态里常见的HikariCP为例配置几个核心参数就能跑起来spring: datasource: url: jdbc:mysql://localhost:3306/test_db?useSSLfalseserverTimezoneAsia/Shanghai username: root password: 123456 hikari: minimum-idle: 5 maximum-pool-size: 20 connection-timeout: 30000minimum-idle表示池里最少保留5个空闲连接maximum-pool-size表示最大能同时存在20个连接connection-timeout是借连接超过30秒就报错。这些参数看着简单实际上要配合数据库端的max_connections一起看。比如MySQL默认最大连接数是151如果你把应用连接池最大数设成200那运行到高峰时直接报too many connections。这个错出现时第一反应不是去改代码而是去看数据库能承受多少连接。连接池还有一个容易被忽略的价值自动检测失效连接。MySQL默认的wait_timeout是8小时如果一个空闲连接超过这个时间没被使用服务端会主动断开而客户端并不知道。这时候从连接池里拿到旧连接去执行SQL就会报connection has been closed这类错误。早年很多新手被这个问题折磨过后来连接池加入了validationQuery或testWhileIdle这类机制拿连接前先探活才大大缓解。至于SSL连接错误这个问题和连接池没有直接关系但它在连接阶段就会炸掉。MySQL 8默认开启SSL客户端连接串里需要正确配置useSSL参数。有时候你会看到服务器端要求SSL但客户端证书缺失这时要么配置证书要么在明确安全的内部网络环境下一开始就设置成useSSLfalse。千万别混乱地在两个方向来回试先确认是哪一侧的证书或协议不匹配再决定处理方式。4.3 数据导入、同步和跨服务器调用从一个Excel里把数据导入数据库是几乎所有人都会遇到的需求。手工逐条插入显然不现实最常见的办法是用Navicat导入向导选择Excel文件映射列表头到表字段预览后执行。这个流程虽然有点繁琐但它会帮你展示每一行对不对比写脚本更加直观。如果用命令行或脚本环境可以用LOAD DATA LOCAL INFILELOAD DATA LOCAL INFILE /path/user.csv INTO TABLE user FIELDS TERMINATED BY , LINES TERMINATED BY \n IGNORE 1 LINES (name, phone, age);这里的分隔符、换行符、是否忽略第一行都要根据实际文件内容调整。导入前要检查字符集文件是GBK编码而表是utf8mb4导进来就是一串乱码。再往前一步数据库同步。生产环境的MySQL主从复制是基础方案主库写、从库读靠的是binlog日志事件同步。如果应用场景不是单纯的主从复制而是需要把不同异构数据库之间的数据打通比如Oracle到MySQL、MySQL到达梦那就会用到同步工具或ETL工具。这里的核心思路不是“把数据复制一份”这么简单而是字段映射、增量判断、冲突处理、断点续传。很多数据库同步软件和数据库同步工具本质上都是在解决这几个问题。还有一类很常见的场景是跨服务器调用。比如你在SQL Server 2019服务器A的IIS上部署了应用但数据库却放在服务器B这本身不是数据库软件的问题而是连接串、端口、防火墙、账号授权的问题。SQL Server还有一种Linked Server功能可以直接在本地查询另一个服务器上的数据执行SELECT * FROM [远程服务器名].[数据库名].[架构名].[表名]。MySQL也有类似的FEDERATED引擎只是使用场景不算广泛。本质上这类跨服务器查询都不适合高频链路偶尔做一次调研分析还行当作核心接口使用会导致你被网络延迟和锁阻塞折磨到怀疑人生。如果是云上的托管数据库服务又不一样的逻辑你不需要关心安装但需要细粒度控制账号权限数据库代理、审计日志、VPC内网隔离都要单独设计。对初学者来说先把自建MySQL搞明白再去理解托管数据库会容易很多因为即使你用的是云RDS背后的SQL和表结构知识依然一模一样。5. 真实项目场景与排错经验5.1 JavaWeb 项目里数据库部分应该准备什么很多人在学习JavaWeb项目时最头疼的不是Java代码而是数据库。一个完整的项目需要有建库脚本、初始化数据、表关系以及连接池配置。如果你的课程设计就是一个JavaWeb项目我的建议是先建库再建表再写代码而不是反过来。项目里常用的建库脚本大概长这样CREATE DATABASE school_job DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE school_job; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, sno VARCHAR(20) UNIQUE NOT NULL COMMENT 学号, name VARCHAR(50) NOT NULL COMMENT 姓名, major VARCHAR(50) DEFAULT NULL COMMENT 专业 );字符集选utf8mb4而不是老旧的utf8是因为它支持完整的Unicode遇到表情符号也不会出错。这句话我每写一个建库脚本都会带上算是一个肌肉记忆。项目配置文件里数据库连接池关键项如下jdbc.urljdbc:mysql://localhost:3306/school_job?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 jdbc.usernameroot jdbc.password123456JDBC连接串里永远要把serverTimezone带上否则你本地时区和数据库默认时区不一致时写入的时间会偏差好几个小时。这个坑在学习和生产中都很常见不少新手以为代码没写错最后发现日期不对。真正开发时没有任何一个正常团队会手写几百行JDBC。主流选择是MyBatis、MyBatis-Plus、JPA这类ORM框架。但底层思路没变通过连接池拿连接执行预编译SQL把结果集映射成对象。写项目案例时我强烈建议至少把一条SQL的执行日志打出来这样才能看到现在这条请求到底是怎么查数据库的。很多人项目跑不起来就发愁其实SQL日志一开五分钟就能定位到是表名拼错还是字段写错。5.2 时序场景MySQL 和 TDengine 如何取舍把MySQL用得非常顺手之后会遇到一类特殊情况物联网设备每一秒上报一次数据一天就有千万条记录。MySQL在这种情况下会越来越臃肿查询变慢、存储变大。这时候需要引入时序数据库比如TDengine。TDengine的建模思路和MySQL最大的区别在于“超级表子表”模型。它会先创建一个超级表用来描述数据的公共结构再把每个设备建模成一张子表。原来的MySQL表里如果有设备ID、时间、电流、电压、位置这些字段转成TDengine时一般把设备ID和位置这类不随数据变化的字段作为标签TAGS把时间戳和测点值作为数据列CREATE STABLE meters ( ts TIMESTAMP, voltage FLOAT, current FLOAT ) TAGS ( location BINARY(20), group_id INT ); CREATE TABLE d1001 USING meters TAGS (Beijing, 1);这种设计看起来有点绕但本质是把“描述设备的属性”和“设备产生的数据”分开存。如果你拿着MySQL的表结构去设计TDengine超级表最常犯的错误就是把所有普通列都当成数据列忘了拆标签。记住一个判断标准某一列的值在每个设备的所有记录里都基本不变那它就是标签如果每行都不一样那才是数据列。选型上如果是标准的网络系统、订单系统继续用MySQL完全没问题如果是设备传感器和历史曲线分析别硬撑直接考虑时序数据库。技术选型不是比谁用得全而是不给自己添堵。5.3 与自有品牌数据库达梦、GBase打交道在一些特定行业的项目里会遇到达梦、GBase这类自有品牌的数据库。它们和MySQL的兼容度并不完全一致有的支持大部分SQL语法有的在某些细节上行为差异很大。目标不是每样都会而是知道一个原则连接驱动、SQL方言、工具支持三者要同时确认。连接达梦数据库时它默认的端口是5236驱动类名通常是dm.jdbc.driver.DmDriver。用Navicat这类客户端连接时驱动选“DM”填对地址、端口、账号即可。很多人在这一步卡住多半是端口写成了MySQL的3306。修改字段注释的语句GBase和MySQL大体相似ALTER TABLE student MODIFY COLUMN name VARCHAR(50) COMMENT 学生姓名;但如果你是从Oracle迁过来会发现Oracle的字段注释是这种写法COMMENT ON COLUMN student.name IS 学生姓名;两种语法看起来都简单一旦在项目里混着用就会报错。所以遇到陌生数据库时第一件事是查官方兼容手册而不是盲猜。另外很多商业管理软件在后台数据库选型前会直接列出一份兼容清单。比如有些ERP系统可能只支持SQL Server 2008及以上你用MySQL不一定能跑甚至不是MySQL本身的问题而是应用层用了大量SQL Server专属语法。这种场景下不是数据库“好不好”的问题而是匹配度的问题。5.4 高频问题排查速查表最后把我在实际项目里经常碰到的一些报错和排查结论整理成一张速查表方便备查。这张表不能解决所有问题但能帮你把思路收敛到大概率方向上。报错或症状可能原因快速处理MySQL服务启动报e0434352.NET组件或VC运行库损坏修复系统运行库检查事件查看器客户端报SSL connection error证书或认证插件不匹配调整连接串useSSL参数检查客户端版本找不到数据库引擎启动句柄服务配置错误或未初始化查看服务路径重新执行mysqld --initializeExcel导入提示64位引擎不支持DBC数据缺少64位Access驱动安装AccessDatabaseEngine_x64使用导入向导sqlplus登录Oracle缓慢监听日志过大、DNS解析异常查看监听日志检查sqlnet.ora超时参数Navicat连接达梦失败驱动未加载或端口错误检查端口5236重新加载达梦驱动应用报too many connections连接池和最大连接数不匹配调整连接池参数优化数据库max_connections很多错误不能只看表面。比如sqlplus登录Oracle慢可能的原因非常多监听日志文件膨胀、DNS解析超时、网络延迟甚至可能是客户端和服务端版本不匹配。遇到这类问题我的习惯是先做分层排查网络层ping和telnet确认通不通系统层看CPU和内存数据库层看监听日志。把问题缩小到某个层面后再针对性地查解决方案。这套思路同样适合MySQL、SQL Server、达梦几乎所有关系型数据库都适用。再分享一个项目里的排查技巧在怀疑数据库连接出错时先用命令行工具执行一条最简单的查询比如MySQL的SELECT 1;。这条命令能通说明服务、端口、账号基本没问题这条命令不通后面的一切排查都没有基础。很多人在应用层花几个小时查代码最后发现是数据库服务压根没起来。我自己带人时还有一个习惯每次接手一套系统先确认数据库的版本号、字符集、隔离级别和备份策略。这四样东西决定了你会遇到哪一类坑也决定了你解决问题能够动用什么手段。刚开始学MySQL的时候不用记太多把安装、常用SQL、连接池、数据同步这些基础串起来就已经很有框架感。后续再多遇到几个坑慢慢就变成真正的实践者了。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →