资讯动态

Windows下MySQL安装实战:从MSI到ZIP,避坑指南

发布时间:2026/10/16 13:17:20 来源:尧图企业网站定制
如果你在Windows上装过MySQL大概能理解那种装完连不上、服务起不来的抓狂。我前前后后在Windows环境里装过很多次MySQL从单机开发库到给项目组搭测试环境都经历过这次把安装过程中值得注意的细节、每一步为什么这么选以及踩过的坑统统整理出来。这篇内容是给“要在Windows上装MySQL”的人准备的无论你是刚入门的学生、要做本地开发的程序员还是帮同事临时搭个数据库环境都可以照着操作。我会覆盖最常用的两种安装方式MSI向导安装和ZIP免安装也会把装完之后必须做的验证、日常运维的高频操作一起讲清楚。目标只有一个装完不仅是“能启动”而是“能放心用”。1. 下载之前先把这三个决定做对很多人卡在第一步不是不会点鼠标而是不知道选什么。MySQL官方下载页上选项不少装到一半发现不合适再重来纯属浪费时间。我建议在下载前就把版本、包格式、位数这三个事情定下来。1.1 版本选8.0还是5.7别只看“最新”先说结论新项目直接上MySQL 8.0老项目需要迁到8.0的也要提前评估兼容性。8.0和5.7的差别不只是大版本号变了。8.0在底层存储上把数据字典统一了不再用frm文件保存表结构默认字符集从latin1改成了utf8mb4引入了窗口函数、公共表表达式CTE这些很有用的SQL能力身份认证插件也从mysql_native_password换成了caching_sha2_password。这些变化对普通开发影响最大的其实就是认证方式。8.0默认创建的账号用的是caching_sha2_password如果你的应用用的是很老的客户端驱动比如特别老版本的PHP mysqli扩展、某些老Navicat版本会报“Authentication plugin caching_sha2_password cannot be loaded”。网上经常看到有人问这个报错基本就是新装8.0配老客户端造成的。当然也可以在建用户时指定老认证方式后面我在第四节会讲到。但我的建议是除非项目有明确约束否则别为了迁就旧客户端去降低安全标准。5.7虽然也有不少存量用户但官方已经停止维护新装环境实在没有理由再选它。同时要注意如果你看到的是5.6甚至更低版本的教程很多参数已经失效照着操作大概率会踩坑。1.2 MSI安装包和ZIP压缩包到底选哪个官方下载页主要给两种Windows包MSI安装向导Installer和ZIP压缩包。MSI方式适合大多数人。它有图形向导会帮你处理安装目录、配置文件、Windows服务注册、环境变量等步骤新手友好度极高。缺点是向导里有不少选项如果完全不理解每步含义容易一路“Next”过去装完发现字符集不对、数据目录乱糟糟。ZIP方式更适合愿意自己控制所有细节的开发者。解压就算完成第一半初始化数据目录、写my.ini、手工注册Windows服务全都要自己做。好处是整个MySQL目录就是安装结果删掉解压目录基本等于卸载干净想换版本、想拿它做绿色版随身携带都很方便。我做本地多个MySQL版本共存测试时基本都用ZIP包。我的建议是第一次装、图省事用MSI想要可控、频繁换版本、喜欢干净卸载用ZIP。1.3 位数选择和“社区版”就够用位数方面没什么悬念现在主流都是64位系统直接选x64。除非你的机器是极其老的32位系统否则不用考虑x86包。另外内存只有4GB的老机器装8.0会比较吃力但那是硬件问题不是版本问题。发行版方面官方下载页有“社区版”和“商用版”的区分。日常开发、测试、学习用社区版完全足够功能上不缩水用的还是GPL开源协议。真正商用、需要官方技术支持的组织才需要考虑付费订阅。所以个人项目直接下社区版就好。下载时要注意文件名里的版本信息比如mysql-installer-community-8.0.x.msi就是Windows下最常见的那个安装引导文件mysql-8.0.x-winx64.zip就是ZIP免安装包。下载后最好顺手用校验工具核对一下MD5或SHA256官方页面都会给校验值。我遇到过下载一半失败导致MSI无法启动的情况校验一下能省去很多莫名其妙的麻烦。2. MSI安装向导实操一步步装到能用MSI方式虽然“无脑”但里面有几个关键步骤值得停下来想一想再点。我以默认的官方Installer流程为线索把每步的选择逻辑说清楚。2.1 安装类型选择和依赖检查启动安装向导后第一个关键选择是Setup Type。常见的几个选项是Developer Default开发者默认、Server only仅服务端、Custom自定义。Developer Default会一次性帮你装上MySQL Server、Workbench工具、Shell命令行、Router、各种驱动组件。听起来省事但它会顺带装不少你可能用不到的东西。如果只是要一个数据库服务我建议选Server only干净利落。后面想补装Workbench随时可以再打开安装器添加。选择Custom则可以自己勾选组件熟悉之后灵活性更高但新手不建议在这里过多纠缠。选完类型点Next向导会检查系统依赖。Windows下最常见的提示就是缺少Visual C Redistributable或.NET Framework。遇到这类情况直接根据提示去装对应运行库装完再回到MySQL安装向导即可。我在Server 2019上装8.0时就遇到过必须先补装某个VC运行库才能继续的情况这属于正常现象不是MySQL本身的问题。2.2 类型与连接设置端口、认证方式要现在定好安装完组件进入配置环节Configuration这里才是真正的重头戏。第一个选择是Config Type有Development Machine开发机、Server Machine服务器、Dedicated Machine专用服务器三个选项。这个选项会影响MySQL为你推荐的内存、并发等系统参数。个人电脑上多数选Development Machine内存占用相对保守。如果选Dedicated MachineMySQL会试着使用更多内存来提升性能配置差的老机器可能被拖慢。接下来是连接设置。默认端口3306要不要启用TCP/IP通常保持默认即可。但要注意两个容易忽略的点如果本机3306已经被其他程序占用比如装了其他版本的MySQL、或者是某些游戏/软件占了3306安装时服务会起不来。可以先在命令行跑netstat -ano | findstr :3306看看有没有进程在监听。端口不是非要3306开发环境完全可以改成3307或其他端口。业务上有连接串约束时不建议乱改但如果你打算在同一台机器上跑多个MySQL实例那每个实例的端口必须不同。认证方式Authentication Method这步8.0向导会给你两个选择Use Strong Password Encryption对应caching_sha2_password和Use Legacy Authentication对应mysql_native_password。教程里通常会说“用推荐的那个”我同意但你要知道这个选择的影响。如果后面用Navicat老版本连接报错就是这里选的强加密导致的解决方案是新建账号或用新客户端也可以用配置把默认认证方式调回去但相当于“降级”不推荐。2.3 root密码和Windows服务配置设置Root账号密码这步没什么好讲的唯一需要注意的是别设一个太简单的密码。开发环境可以不算复杂但至少要输两遍确认不会记错。密码忘了的恢复方法我在第五节会详细讲但能不忘最好别忘。然后向导会让你设置Windows服务名。默认名字类似MySQL80这个服务名最好记一下因为后续启停都是对着这个名字操作。你可以把它改成更直观的名字比如mysql-dev前提是别和已有服务重名。接下来是服务账户选择。默认使用Windows内置的Network Service账户运行服务这个选择安全性比较合适不要随手改成Local System除非你明确知道需要。下面有个“Start at Windows boot”之类开机自动启动的选项建议勾上。不勾也行但每次开机后都要手动net start 服务名时间长了很容易忘。再往下的“Windows Firewall”步骤如果你的机器上有防火墙向导会提示是否允许MySQL端口通信。开发机建议允许否则后面局域网内另一台电脑连不上你的数据库排查起来特别头大。配置完成后向导会生成一份配置文件一般放在C:\ProgramData\MySQL\MySQL Server 8.0\my.ini。注意ProgramData是隐藏目录直接在资源管理器里看不见需要开启“显示隐藏的项目”或在地址栏手动输入路径。以后要调整端口、字符集、日志参数改的就是这个文件改完必须重启MySQL服务才生效。3. ZIP免安装方式适合项目开发与多版本共存ZIP方式在了解原理的人看来其实更干净。整个数据库就是一个文件夹掌握初始化和服务注册这两个命令之后你会比用MSI安装的人更清楚MySQL在Windows上到底是怎么工作的。3.1 解压和my.ini配置下载ZIP包后解压到一个没有空格的目录比如D:\mysql-8.0.x-winx64。不建议放到C:\Program Files这种带空格的路径因为后续写配置、写脚本时路径带空格要额外加引号容易出错。解压后先别急着初始化先创建一个配置文件my.ini。MySQL在Windows上启动时会按顺序寻找配置文件一般放在解压目录下最直观。一个最精简但够用的my.ini大概长这样[mysqld] # 端口号 port3307 # 安装目录 basedirD:/mysql-8.0.x-winx64 # 数据目录 datadirD:/mysql-8.0.x-winx64/data # 默认字符集 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci # 允许最大连接数 max_connections100 # 日志相关 log-error-verbosity2 [client] default-character-setutf8mb4这里有几个细节要注意。路径里的分隔符建议统一用正斜杠/或者双反斜杠\\用单个反斜杠\会被当成转义字符比如d:\mysql里的\m就可能会出问题。这是新手在ZIP方式下最常踩的坑。数据目录datadir指向的文件夹不需要提前手动创建。如果用--initialize初始化MySQL会自己建如果用--initialize-insecure也会自动建好。如果你提前建了空目录也没关系关键是别在目录里放无关文件否则初始化会报错。3.2 初始化与启动--initialize和--install的区别配置写好后用管理员身份打开命令提示符cmd先切到MySQL解压目录下的bin目录然后执行初始化命令。cd /d D:\mysql-8.0.x-winx64\bin mysqld --initialize --console这个命令会在datadir目录生成系统数据库和系统表同时给root用户生成一个随机临时密码。密码会打印在控制台里也会写进数据目录下的err日志文件。如果你用的是--console输出临时密码就在最后几行类似A temporary password is generated for rootlocalhost: xxxx一定要先抄下来。如果你不想要临时密码可以用mysqld --initialize-insecure这样初始化出来的root账号是空密码。本地开发图方便可以这么干但只要数据库要暴露到网络必须尽快给root设置强密码。初始化完成之后把MySQL注册成Windows服务mysqld --install MySQLZIP这里的MySQLZIP是服务名你自己定。这个命令会在Windows服务管理器里注册一个服务以后就可以用net start MySQLZIP来启动。如果提示“Install/Remove of the Service Denied”说明当前终端不是管理员权限重新用管理员身份打开cmd。启动服务net start MySQLZIP连接测试mysql -uroot -p输入之前保存的临时密码即可进入MySQL命令行。如果你用的是空密码初始化直接mysql -uroot即可。有一点挺重要mysqld --install只是注册服务不会自动启动它。很多人执行完install命令后以为装好了发现3306端口没监听就是因为还没执行net start。另外如果服务启动后立即停止并报错大概率是my.ini里的datadir路径不对或者data目录里的文件和当前版本对不上优先检查这两点。3.3 用命令行完成安全设置ZIP方式没有图形向导所以密码和账号设置都必须用SQL命令完成。登录后第一件事就是改密码ALTER USER rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;这样就把临时密码换成了自己的密码。如果初始化时用的是空密码这一步也尽早做。ZIP方式和MSI方式在本质流程上没有区别只是把“向导帮你做”的事情换成了一句句命令。理解了这一步你以后再遇到需要批量部署MySQL或者要在离线环境下装数据库会从容很多。4. 安装后必须做的三件事连接验证、字符集、普通用户服务起来了不代表安装就是成功的。我见过太多人“服务已启动”就以为大功告成结果应用一连报字符集错误、权限错误。安装完成后我建议固定做下面三个检查。4.1 命令行的基本连接和验证无论用哪种方式安装装完都可以打开命令行执行mysql -uroot -p登录后先确认版本SELECT VERSION();再确认当前连接的账号SELECT CURRENT_USER();然后看基本变量SHOW VARIABLES LIKE port; SHOW VARIABLES LIKE socket;Windows下没有socket文件所以socket变量是空的或不可用这很正常。重点看一下port是否符合预期。如果你的my.ini里改了端口连接时要显式指定mysql -uroot -p -P3307忘了加-P参数会默认连3306然后就出现“Access denied”或者“Cant connect”之类的报错。这个小问题困扰过不少刚上手的朋友。4.2 字符集与排序规则设置字符集问题在Windows上尤其容易碰见。Windows中文环境默认好几种编码混乱的坑而MySQL服务端字符集配置不对后存进去的中文取出来全是乱码。登录后查看当前字符集配置SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE collation_server;如果看到的不是utf8mb4请打开my.ini在[mysqld]段加两行character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci然后重启服务。键一点要说明MySQL的utf8和utf8mb4不是一回事。MySQL历史上那个utf8最多支持3字节编码存不了emoji这类4字节字符所以真正要存“”这种符号必须用utf8mb4。尤其现在很多应用的数据库连接串里讨厌地指定了字符集数据库端如果还是老的utf8必然出问题。排序规则utf8mb4_0900_ai_ci是8.0默认值支持不区分大小写的比较_ci比较规则也更新。如果你的应用对排序有特殊要求比如要求区分大小写要用utf8mb4_0900_bin或utf8mb4_bin可以在建库时单独指定但库级别默认用0900_ai_ci问题不大。4.3 创建应用专用账号而不是一直用root这是我最想强调的一个习惯别用root账号跑业务应用。root账号拥有所有权限一旦应用被注入或配置文件泄露攻击者可以直接拖库、删库。开发阶段“贪方便”用root上线前再改往往就会漏掉一些连接串。所以装好之后顺手建一个应用专用账号CREATE USER appuserlocalhost IDENTIFIED BY app_pass_2024; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO appuserlocalhost; FLUSH PRIVILEGES;这里localhost表示只允许本机连接。如果应用部署在另一台机器需要把localhost替换成那台机器的IP比如CREATE USER appuser192.168.1.100 IDENTIFIED BY app_pass_2024;也可以写成appuser%表示不限制来源IP。要注意%不等于“安全”反而意味着任何能连通你数据库的机器都可以尝试登录所以密码强度必须足够。另外如果应用需要连接8.0实例但客户端驱动很老可以给这个账号指定老认证方式CREATE USER appuserlocalhost IDENTIFIED WITH mysql_native_password BY app_pass_2024;但这种做法只作为兼容老客户端的临时方案新代码尽量升级驱动。5. 高频问题排查装完连不上、起不来、密码忘了Windows上装MySQL出现问题基本集中在“服务起不来”“连接不上”“登录被拒”这三类。下面按我实际排查时的顺序整理照着走基本都能解决。5.1 服务启动失败排查顺序服务启动失败时Windows提示往往很笼统“MySQL服务无法启动。服务没有报告任何错误。”它不告诉你具体哪错了这时候别干瞪眼按下面的顺序来第一步看错误日志。MySQL的err日志在datadir目录下文件名一般叫计算机名.err或者mysqld.err。用文本编辑器打开最后几十行它通常会直接告诉你致命问题出在哪最常见的是[ERROR] [MY-010338] InnoDB: Cannot open datafile ./ibdata1 [ERROR] [MY-010934] Incorrect database name mydb如果是数据文件打不开很可能是datadir路径写错或者目录权限不对。如果是配置参数不认识检查my.ini里有没有写错参数名。第二步检查事件查看器的“Windows日志-系统”。在运行框输入eventvwr.msc打开找源为MySQL相关的记录有时会给出比err日志更明确的提示。第三步确认端口有没有被占用。服务和端口是两回事服务可能起来了但因为端口被占用监听失败后服务又停了。命令netstat -ano | findstr :3306有进程占用的话最后边长的那串数字就是PID。如果想确认是谁tasklist | findstr PID号如果是PID明确指向了另一个mysqld那说明本机已经有一个MySQL实例在跑要么停掉旧的要么让新实例换端口。如果占用进程不是MySQL就要权衡是换端口还是结束该进程。另外提醒一下mysqld扫描my.ini是有顺序的。它默认按%WINDIR%\my.ini、C:\my.ini、basedir\my.ini这样的顺序读取。如果你的配置文件没有放在正确位置你改了半天的参数压根没生效。所以排查时先确认mysqld --verbose --help输出结果前几行会显示它实际读取的配置文件路径。5.2 root密码重置的两种方法密码忘了这是MySQL安装后出现频率极高的问题。有两条路可以走。方法一跳过授权表开发机临时方案先把服务停掉net stop MySQL服务名然后以跳过授权表方式启动MySQL。注意是启动进程不是启动Windows服务mysqld --skip-grant-tables --console这个进程会独占3306端口并且不检查任何账号密码。此时重新开一个cmd执行mysql -uroot就可以无密码登录。进入后先把权限表加载回来FLUSH PRIVILEGES;再重置密码ALTER USER rootlocalhost IDENTIFIED BY 新密码;改完后关闭第一个cmd窗口里的mysqld进程然后重新net start 服务名启动服务。一定要记住--skip-grant-tables模式下任何能连到3306端口的访问都不需要密码如果数据库暴露在网络里这是极其危险的。所以这个方法只适合本机开发环境用完立刻恢复不能长时间开。方法二在my.ini里临时加参数这个方法更不容易出错。在my.ini的[mysqld]段加一行skip-grant-tables重启服务此时同样不需要密码就能登录。按上面的流程改完密码后把这一行注释掉或删掉再重启一次服务就恢复正常。对比下来方法一适合你不想改配置文件的情况方法二适合你习惯操作文件的情况。两条路本质相同都是绕过权限检查。5.3 端口占用和访问拒绝的应对“Access denied for user rootlocalhost”这个报错要分清是密码错了、不该连接的IP还是密码对但权限不足。密码错了错误日志和提示都会有明确信息重试一遍就行。但要注意命令行执行mysql -uroot -p时系统是会在你按回车后让输入密码的。如果直接在-p后面跟着密码写进命令比如mysql -uroot -p123456那么密码会出现在历史记录和进程列表里生产环境千万别这么干。如果账号是rootlocalhost但应用从另一台机器连接默认会被拒绝因为MySQL的账号匹配是按“账号来源主机”的组合来判断的。此时要么改账号来源范围为%要么新建一个针对该IP的账号要么确认网络层是否能到达3306端口防火墙很可能是罪魁祸首。端口连不上的另一个经典场景Windows防火墙没放行。安装MySQL服务时Windows经常弹窗问是否允许手快点了取消就会导致外部完全连不上。处理方法是进入“Windows Defender防火墙-高级设置”给当前网络配置文件加一条入站规则放行TCP 3306端口。只开放到内网网段不要对公网随便开放这既是技术问题也是安全问题。5.4 高频问题速查表为了方便直接查阅把上面这些常见问题整理成一张表现象最常见原因快速处理服务启动后立即停止my.ini路径或datadir不对查看data目录下的.err日志服务启动报“服务没有报告错误”配置参数写错或端口被占事件查看器 netstat排查连接报Cant connect to MySQL server服务没启动或端口不符net start 服务名客户端加-P端口连接报Access denied密码错误或账号来源不匹配重置密码或调整账号Host报Authentication plugin caching_sha2_password cannot be loaded老客户端驱动不兼容新认证升级驱动或临时用mysql_native_password建号中文写成乱码字符集不是utf8mb4改my.ini并重启服务--install提示权限错误终端不是管理员右键“以管理员身份运行”cmd6. 装好只是开始备份、日志与参数调优建议MySQL装完能跑起来只是万里长征第一步。真正让你“敢把数据交给它”的是备份策略、日志监控和基础参数配置。这几件事在Windows上和Linux上有一点差异但核心思路相同。6.1 用mysqldump做日常备份mysqldump是MySQL自带的逻辑备份工具在bin目录下。备份一个数据库mysqldump -uroot -p mydb D:\backup\mydb_20240101.sql恢复mysql -uroot -p mydb D:\backup\mydb_20240101.sqlWindows下的cmd不支持和吗是完全支持的只是注意路径不能有中文和空格有空格要加引号。如果要备份所有库mysqldump -uroot -p --all-databases D:\backup\all_20240101.sql我个人的习惯是给备份文件加上日期后缀再用Windows任务计划程序taskschd.msc定期执行。写一个简单的bat文件echo off set BACKUP_DIRD:\backup set DATE%date:~0,4%%date:~5,2%%date:~8,2% mysqldump -uroot -p你的密码 --all-databases %BACKUP_DIR%\all_%DATE%.sql注意把密码明文写在脚本里有泄露风险生产环境建议使用--defaults-extra-file指定一个只有你自己有权限的配置文件来存放密码。开发机图省事的话起码保证这个bat文件不会放在共享目录里。另外mysqldump属于逻辑备份导出的是SQL语句适合中小型数据库。数据量大到几十GB以后备份恢复时间会变长那时要评估是否引入物理备份工具但大多数Windows开发环境用不到这个深度。6.2 慢查询日志和错误日志怎么看排查性能问题时慢查询日志是首选。在my.ini的[mysqld]段开启slow_query_log 1 slow_query_log_file D:/mysql-8.0.x-winx64/data/slow.log long_query_time 2long_query_time单位是秒含义是执行时间超过这个值的SQL会被记录下来。注意这个参数默认值是10秒实际业务中你通常更关注超过1秒或2秒的SQL可以根据情况调小到1或2。开启后可以用SHOW GLOBAL STATUS LIKE Slow_queries;查看慢SQL数量。但更直接的是打开slow.log文件看里面记录的具体语句。定位到慢语句后用EXPLAIN SELECT ...分析执行计划看是否命中索引这已经是性能调优的另一个话题了。错误日志方面除了启动失败时用日常也要学会看。错误日志文件位置可以通过SHOW VARIABLES LIKE log_error;查看。8.0的错误日志默认记录了启动和关闭过程、连接超时、复制异常等尤其当应用突然连不上时错误日志往往第一现场。6.3 值得调整的核心参数Windows上装完MySQL大部分参数用默认值能跑但下面几个参数在遇到性能瓶颈时值得先看innodb_buffer_pool_sizeInnoDB缓存表数据和索引的内存池大小。默认值128MB对现代机器偏保守如果本机内存充裕比如16GB可以调到1GB到4GB。在my.ini中调大后重启服务往往能立刻提升读多写少场景的响应速度。max_connections默认151。如果你的应用并发连接数高比如用了连接池且部署了多个应用实例需要适当调大。但要小心连接数不是越大越好每个连接都会占用线程和内存调大了而内存跟不上反而会让服务变慢。transaction_isolationMySQL默认是REPEATABLE READ可重复读。大多数开发场景不必改但如果你的应用用不上事务可以用READ COMMITTED降低锁竞争。改这个参数前必须理解隔离级别语义否则可能造成数据读取行为变化。expire_logs_days8.0里对应binlog_expire_logs_seconds如果你开启了binlog不设过期时间的话binlog会越攒越多把磁盘打满。这个坑我踩过磁盘报警才发现半年没人清理binlog。8.0里可以设置binlog_expire_logs_seconds 604800意思是binlog保留7天。调参逻辑永远是一条改一个、重启、验证效果尽量不要一次性梭哈所有参数。Windows下的MySQL服务重启很快但也要挑非高峰时间操作。7. 最后分享一个装完必做的小动作装完MySQL后我建议你第一时间把配置文件和命令行的使用方式刻进肌肉记忆。具体来说第一把my.ini的路径用记事本保存到一个备忘文件里Windows下它藏在隐藏目录时间一长真会忘。第二打开一个新的cmd窗口不是直接敲mysql而是敲mysql --version确认命令是否在PATH里。MSI安装一般会自动配好环境变量ZIP方式需要你手动把bin目录加到系统环境变量Path里否则每次都要全路径访问非常难受。加到Path的操作不复杂右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 找到系统变量Path → 编辑 → 新建 → 填入你的MySQL解压目录下的bin路径然后确定。之后新开的cmd窗口才能生效已经打开的窗口不会自动刷新。还有一个小习惯不管是在开发机还是测试环境每次装完MySQL我都会顺手执行一次mysqld --verbose --help大致扫一眼实际生效的配置确认basedir、datadir、port、字符集这些关键项都和自己预期一致。这看起来多一步但能很大程度上避免“你以为配置了其实没生效”的尴尬。根据我个人经验Windows上装MySQL这件事百分之八十的坑都出在路径、权限、端口和字符集这四个关键词上。把这四个关键词记在心里不管以后换哪台机器、装哪个版本你都会比大多数人更顺利。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑