{"id":23087626,"url":"https://github.com/exp-codes/onekey-mysql","last_synced_at":"2025-04-03T16:45:42.171Z","repository":{"id":245666357,"uuid":"818877180","full_name":"EXP-Codes/onekey-mysql","owner":"EXP-Codes","description":"一键 注册/反注册/启动/停止 mysql 脚本","archived":false,"fork":false,"pushed_at":"2025-01-06T09:14:34.000Z","size":576,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-27T21:49:02.461Z","etag":null,"topics":["mysql","onekey","programming"],"latest_commit_sha":null,"homepage":"","language":"Batchfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EXP-Codes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-23T06:06:17.000Z","updated_at":"2025-01-06T09:14:38.000Z","dependencies_parsed_at":"2024-06-23T09:27:11.852Z","dependency_job_id":"0e995082-6b7d-419e-a0ef-2986fef8533f","html_url":"https://github.com/EXP-Codes/onekey-mysql","commit_stats":null,"previous_names":["exp-codes/onekey-mysql"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EXP-Codes%2Fonekey-mysql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EXP-Codes%2Fonekey-mysql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EXP-Codes%2Fonekey-mysql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EXP-Codes%2Fonekey-mysql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EXP-Codes","download_url":"https://codeload.github.com/EXP-Codes/onekey-mysql/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247043243,"owners_count":20874084,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mysql","onekey","programming"],"created_at":"2024-12-16T19:59:20.111Z","updated_at":"2025-04-03T16:45:42.155Z","avatar_url":"https://github.com/EXP-Codes.png","language":"Batchfile","readme":"# onekey-mysql\n\n\u003e 一键 注册/反注册/启动/停止 mysql 脚本\n\n\n## 0x00 前言\n\n由于 Mysql 一直都有着极为严格的登录权限校验、以致不少同学都会被卡在初始化的地方，极让人抓狂。\n\n很多时候在 [Mysql 官网下载](https://dev.mysql.com/downloads/mysql/) 绿色版的 zip ，目的不过是想独立部署一个简单测试库进行验证，但 Mysql 不准 —— 你必须先处理各种弯弯绕绕的无关问题：\n\n- 写配置项意义不明的配置文件： Mysql8 甚至不再提供模板\n- 找到 root 用户的密码： Mysql8 竟然是随机生成的还藏起来\n- 找到密码你还不一定能登录，你一定不陌生： `ERROR 1130 (HY000) Host is not allowed to connect to this MySQL server`\n- 登录后还要修改 root 密码、修改权限\n- 都做完后发现客户端还是无法连接： Mysql8 对密码做了加密\n- ...\n\n每次都要处理这么多工序，就很让人烦躁。\n\n针对这些痛点，我做了 4 个开箱即用的一键脚本: [Github/Onekey-Mysql](https://github.com/EXP-Codes/onekey-mysql/)\n\n\n## 0x10 脚本简介\n\n以下脚本需要确保 Mysql 的**解压路径为纯英文**，并且使用**管理员权限**运行：\n\n| 脚本 | 说明 | 关键词 |\n|:---|:---|:---:|\n| [_svcname](./win/_svcname) | Mysql 服务名称，被所有脚本读取 | 服务名称 |\n| [01_register.bat](./win/01_register.bat) | Mysql 服务注册脚本，用于初始化或迁移位置 | 初始化，迁移 |\n| [my.tpl.ini](./win/my.tpl.ini) | Mysql 配置文件模板，配合服务注册脚本使用 | 配置模板 |\n| [02_start.bat](./win/02_start.bat) | Mysql 服务启动脚本 | 启动 |\n| [03_stop.bat](./win/03_stop.bat) | Mysql 服务停止脚本 | 停止 |\n| [04_unregister.bat](./win/04_unregister.bat) | Mysql 服务反注册脚本，用于迁移位置 | 迁移 |\n\n\n\n## 0x20 使用方式\n\n### 0x21 安装\n\n1. 从 [官网下载](https://dev.mysql.com/downloads/mysql/) Mysql 的 zip 压缩包，解压到**纯英文路径** \n2. 把 [win](./win/) 目录下所有文件复制到 Mysql 的解压后的根目录\n3. 执行 [`01_register.bat`](./win/01_register.bat) 脚本初始化，过程中有两次交互：\n    - 选择数据库编码： UTF-8（默认），GBK（简中），BIG5（繁中），latin1（英文）\n    - 设置 root 用户密码\n4. 完成后会生成：\n    - my.ini 配置文件\n    - data 数据存储目录\n\n## 0x22 启停\n\n- 启动脚本： [`02_start.bat`](./win/02_start.bat)\n- 停止脚本： [`03_stop.bat`](./win/03_stop.bat)\n\n\n## 0x23 迁移\n\n如果要迁移 Mysql 到别的位置，依次执行：\n\n1. 停止并反注册服务： [`04_unregister.bat`](./win/04_unregister.bat)\n2. 移动整个 Mysql 到新位置\n3. 执行 [`01_register.bat`](./win/01_register.bat) 脚本重新注册：\n    - 此时因为检测到 data 目录已存在，并不会重新初始化\n    - 但是会自动备份 my.ini 配置文件，然后根据新位置重新生成一个\n\n\n## 0x24 卸载\n\n如果要完全卸载 Mysql 服务，执行 [`04_unregister.bat`](./win/04_unregister.bat) 即可。\n\n\u003e 此脚本只是停止服务 + 反注册，不会删除 data 目录，数据并不会丢失\n\n\n## 0x30 注册脚本解读\n\n\u003cdetails\u003e\n\u003csummary\u003e逻辑解读\u003c/summary\u003e\n\u003cbr/\u003e\n\n这些脚本中，核心是注册脚本，这里为大家解读一下脚本逻辑：\n\n```mermaid\nflowchart TD\n    A[检查 Mysql 服务是否已注册] --\u003e|已注册| B[不执行任何动作]\n    A --\u003e|未注册| C[检查 data 目录是否为空]\n    C --\u003e|不为空| D[重新注册 Mysql 服务]\n    C --\u003e|为空| E[初始化 Mysql]\n    E --\u003e F[用户交互：选择数据库编码]\n    F --\u003e G[自动备份旧的 my.ini 配置]\n    G --\u003e H[路径 + 编码 =\u003e 新的 my.ini 配置]\n    H --\u003e I[使用无密码命令初始化 data 目录]\n    I --\u003e J[注册并启动 Mysql 服务]\n    J --\u003e K[用户交互：输入 root 用户密码]\n    K --\u003e L[使用超管命令设置 root 密码]\n```\n\n1. 检查 Mysql 服务是否已注册，若已注册不执行任何动作\n\n![](./imgs/01.jpg)\n\n2. 检查 `data` 目录是否为空，若不为空则仅重新注册；若为空则进入初始化流程\n\n![](./imgs/02.jpg)\n\n\n3. 用户交互：要求选择【数据库编码】\n\n![](./imgs/03.jpg)\n\n\n4. 自动备份旧的 `my.ini` 配置\n5. 根据【脚本所在位置】和【数据库编码】，利用 `my.tpl.ini` 配置模板生成新的 `my.ini` 配置\n6. 执行 `mysqld --initialize-insecure` 命令以无密码方式初始化 `data` 目录\n7. 执行 `mysqld --install` 命令注册 Mysql 服务\n8. 执行 `net start mysql` 命令启动 Mysql 服务\n9. 用户交互：要求输入 root 用户【密码】\n10. 执行 `mysqladmin -u root password ${密码}` 设置 root 密码\n\n![](./imgs/04.jpg)\n\n11. 随后任意终端或客户端，即可登录 Mysql\n\n![](./imgs/05.jpg)\n\n\u003c/details\u003e\n\n\n## 0x40 其他过程记录\n\n\u003cdetails\u003e\n\u003csummary\u003e过程记录\u003c/summary\u003e\n\u003cbr/\u003e\n\n### 0x41 初始化没有打印 root 密码\n\n假如不使用无密码方式 `mysqld --initialize-insecure` 初始化数据库，而是使用 `mysqld --initialize` 初始化，会为 root 用户生成一个随机密码。\n\n但如果在初始化时没有使用 `--console` 参数输出到控制台，很多同学就因为不知道密码而无法登录。\n\n此时可以在 `data/{主机名}.err` 日志文件中查找关键字 `A temporary password` 得到初始密码:\n\n![](./imgs/06.jpg)\n\n\n### 0x42 初始化后本地连接无法通过权限检查\n\n我在刚开始做这 4 个脚本的时候发现，初始化后无论如何也无法登录进去，不管有密码还是没密码初始化，甚至 mysqladmin 超管也无法连接，一直报错 `ERROR 1130` （权限检查不通过）:\n\n![](./imgs/07.jpg)\n\n查了 2 天才发现原因是我把用于 docker 的 mysql 配置项复制到 my.ini 了：\n\n```ini\nskip-host-cache     ; 禁用主机 DNS 缓存，解决某些 DNS 解析问题\nskip-name-resolve   ; 禁用 DNS 解析，只使用 IP 地址进行权限检查\n```\n\n这两个配置项在 docker 环境是正常的，但是到了物理机就会出问题，删除后恢复正常。\n\n\n### 0x43 一键脚本无法获取服务名\n\n实测某些 win 系统无法正常通过 `set /p SVC_NAME=\u003c_svcname` 命令获取服务名，此时批量把 01 ~ 04 四个 bat 脚本中的这条命令、都替换成 `set \"SVC_NAME=MysqlSvc_By_EXP\"` 即可。\n\n\u003e 服务名 `MysqlSvc_By_EXP` 可随意改，四个脚本保持一致即可，但是修改后就不要动了，尤其是旧服务还没停止 + 反注册的前提下，否则会因为端口被占用导致更名后的服务无法启动\n\n\u003c/details\u003e","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexp-codes%2Fonekey-mysql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexp-codes%2Fonekey-mysql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexp-codes%2Fonekey-mysql/lists"}