V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
KaneW95
V2EX  ›  程序员

mac 使用 brew 安装 mysql,登录时报错: ERROR 1045: Access denied for user ‘root‘@‘localhost‘ (using password: YES)

  •  
  •   KaneW95 · 41 天前 · 3819 次点击
    这是一个创建于 41 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是什么原因呢,网上找了好多方法都没解决,是不是权限有问题,我看了进程,mysql 不是在 root 账户上的,有没有大佬解答一下

    65 条回复    2025-05-09 17:04:01 +08:00
    quqiu
        1
    quqiu  
       41 天前
    如果是测试用的,其实可以起 docker 。
    hexiaowu1993
        2
    hexiaowu1993  
       41 天前
    为什么不用 docker 跑啊,挂载到宿主机,方便得很。
    263
        3
    263  
       41 天前
    root 密码不对
    KaneW95
        4
    KaneW95  
    OP
       41 天前
    @263 开启安全模式,也没用
    KaneW95
        5
    KaneW95  
    OP
       41 天前
    @hexiaowu1993 我试试
    neutrino
        6
    neutrino  
       41 天前 via Android
    搜“修改 MySQL root 密码”,应该是起个 mysqld skip 之类的然后 mysql 空密码进去改
    julyclyde
        7
    julyclyde  
       41 天前   ❤️ 1
    @quqiu
    @hexiaowu1993
    这事跟 docker 就没有任何关系

    难道用了 docker 就可以不必学习 mysql 权限控制相关知识了?
    263
        8
    263  
       41 天前   ❤️ 1
    首次安装后,可能会生成临时密码,去 log 里面找。然后首次登录进去后需要修改 root 密码
    hefish
        9
    hefish  
       41 天前
    这个 root 是 mysql 的 root 账号, 不是系统的 root
    另外根据 Mysql 的不同版本, 有些新版为了安全起见,默认 root 密码是随机生成的,需要去 log 里找。
    如果找不到, 可以去网上搜一下 找回 mysql root 密码的操作。 大致是用--skip-grant-table 参数 手动启 mysqld ,然后直接用 mysql 连接。
    billgong
        10
    billgong  
       41 天前
    Homebrew 的 MySQL 和 MariaDB 默认 root 没密码,但都开了用户账户保护。必须 `sudo mysql -uroot` 才能登入。TCP 登入对 root 账户也是设限的,要生成其他账户才能通过 TCP 登陆。

    MariaDB 策略稍稍不同,会初始化的时候会生成一个和安装用户同名的高权限账户,所以可以直接用 mysql 命令(不加用户名)登入。
    quqiu
        11
    quqiu  
       41 天前
    @julyclyde 用 docker 就不用管这些权限的问题了,起了容器直接就连了。
    julyclyde
        12
    julyclyde  
       41 天前
    @billgong 都已经-uroot 了,为啥要 sudo ?
    julyclyde
        13
    julyclyde  
       41 天前
    @quqiu docker 已经成了你们这些懒于学习的人的遮羞布了
    quqiu
        14
    quqiu  
       41 天前   ❤️ 1
    @julyclyde #13 不是兄弟,配个 mysql 权限有啥懒人不懒人,你这懒人的评判标准着实有点
    julyclyde
        15
    julyclyde  
       41 天前
    @quqiu 你用 docker 就能保证不需要配置就能进去?
    那如果有人把 image 替换掉呢,替换成一个带密码的,
    你都没学过啊!你又当如何应对?
    ZeekChatCom
        16
    ZeekChatCom  
       41 天前
    @julyclyde 虽然我没有试过 `sudo mysql -uroot`,但是你的疑问就说明你没有理解。

    sudo 是对 mysql 命令生效,可简单理解为用系统 root 的身份执行 mysql ,而 -uroot 是使用 mysql 的 root 账号登录。不是一回事儿啊。
    julyclyde
        17
    julyclyde  
       41 天前
    @ZeekChatCom 恰相反,我这么反问就是想说明是你没理解

    mysql 的权限系统并不在乎是谁执行客户端,而在乎客户端在 3306 的通信里出示的用户名。
    mysql -uroot 并不需要 sudo

    你那种 sudo 的作风倒是适合 microsoft sqlserver 的 NTLM 认证方式
    你都还没试过,自己瞎猜,还出来教人
    ZeekChatCom
        18
    ZeekChatCom  
       41 天前
    @julyclyde 我的评论不针对命令本身,只针对 sudo 和 -uroot, 这俩没有任何关系。
    ZeekChatCom
        19
    ZeekChatCom  
       41 天前
    @julyclyde 你 12 楼的言论,『都已经-uroot 了,为啥要 sudo 』,明显认为二者存在某种关联,事实上这两者没什么关系。
    EricXuu
        20
    EricXuu  
       41 天前 via Android
    你重装一遍,看 brew 的执行日志,有提示的
    julyclyde
        21
    julyclyde  
       41 天前
    @ZeekChatCom 对啊,事实上没什么关联

    教唆别人 sudo 的是
    @billgong 不是我啊
    ZeekChatCom
        22
    ZeekChatCom  
       41 天前
    @julyclyde 另外 mysql 命令,默认使用的是 unix domain socket 通信, 此时受文件权限影响,sudo 可能是有必要的。你说的 3306 端口,那意思是百分百使用 TCP 套接字了?明显你是不对的。
    julyclyde
        23
    julyclyde  
       41 天前
    @ZeekChatCom 公共服务的 sock 文件都是 666 的。

    3306 这个是我的问题。我应该说“在 mysql 的通信协议里出示的用户名”
    ZeekChatCom
        24
    ZeekChatCom  
       41 天前
    @julyclyde #21 @billgong 教别人使用 sudo 没有问题,有问题的是你。
    julyclyde
        25
    julyclyde  
       41 天前
    @ZeekChatCom 教唆 sudo 显然是有错的,首先混淆了执行 mysql 客户端的身份和 mysql 通信协议里的身份
    其次会导致.mysql_history 文件的路径不对

    sock 文件的权限不需要考虑,都是 666
    ZeekChatCom
        26
    ZeekChatCom  
       41 天前
    @julyclyde #23 公共服务的 sock 文件都是 666 的。这句话不完全正确。没有这个约定,只是通常比较宽松。也只是通常。
    ZeekChatCom
        27
    ZeekChatCom  
       41 天前
    @julyclyde 你再读一读 @billgong 在 #10 的发言。一点毛病都没有。
    julyclyde
        28
    julyclyde  
       41 天前
    @ZeekChatCom 嗯,你说的对

    我这里遭遇奇怪现象了。我看了看我自己的,sock 文件 0777 ,但是 systemd show 显示 UMask 才 0022
    我先研究研究我自己的烂摊子去吧
    julyclyde
        29
    julyclyde  
       41 天前
    @ZeekChatCom
    @billgong 教唆 sudo 一定是错的。我坚持
    MoYi123
        30
    MoYi123  
       41 天前
    brew 装的 mysql 确实挺神秘的, 我几个月前想给家里的 kodi 配置 mysql 同步也搞了好久.
    SDYY
        31
    SDYY  
       41 天前
    mysql5.x 和 8.+ 密码加密方式不一样导致的吧
    julyclyde
        32
    julyclyde  
       41 天前
    @SDYY 旧数据升级才会发生加密方式不同的问题
    这里问的应该是新装
    lscho
        33
    lscho  
       41 天前
    不是,你们用 brew 装完包都不看提示的吗? mysql 装完会提示

    We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

    MySQL is configured to only allow connections from localhost by default

    To connect run:
    mysql -uroot

    事后忘记了,用 brew info xxx 也能看到。


    用 mysql_secure_installation 命令设置一下密码就行了啊。


    brew 不一定是万能的/一键的,很多包装完都要根据提示初始化或者设置一下权限、加一下环境变量之类的。
    julyclyde
        34
    julyclyde  
       41 天前
    mysql_server 代码比较复杂,我也没读过啊。简单 grep 了一下
    在 sql/conn_handler/socket_connection.cc 文件中有一句 umask(0)应该是决定了 sock 文件 0777 的因素
    所以本地访问 mysql 必然是不需要 sudo 的
    davidqw
        35
    davidqw  
       41 天前
    为何不用官网安装包呢,一步步自定义配置比较省心,系统设置里也有面板来配置和开启/关闭服务器 https://dev.mysql.com/downloads/mysql/
    nutting
        36
    nutting  
       41 天前
    我用 orbstack 的 docker 装 arm 的 mysql ,数据映射出来,很香,同步到别的机器也很方便
    billgong
        37
    billgong  
       41 天前
    @julyclyde #25 用 sudo 是对的,因为我说了通过 TCP 用 root 空密码默认有限制,而 mysql 命令是通过 socket 连接的,root 空密码就得通过 uid 0 连接。

    你完全可与取消限制,Homebrew 的 cavets 说了,可以运行 mysql_secure_installation 配置
    billgong
        38
    billgong  
       41 天前
    @julyclyde Homebrew 环境下“教唆” sudo 确实不对,但我没“教唆”
    Homebrew 也不像 scoop 那样能完全免疫 sudo 的使用,要实事求是
    billgong
        39
    billgong  
       41 天前
    @SDYY #31 MySQL 8 刚开始的时候有这个问题,后来 Homebrew distro 好像又单独从 sha 换回 native 了,默认没这个问题了
    billgong
        40
    billgong  
       41 天前
    @lscho #33 相信我,绝大多数人运行命令都不看输出
    AlbertGuo
        41
    AlbertGuo  
       41 天前
    @KaneW95 brew info mysql 的详细信息写了连接方式

    We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

    MySQL is configured to only allow connections from localhost by default

    To connect run:
    mysql -u root

    To start mysql now and restart at login:
    brew services start mysql
    Or, if you don't want/need a background service you can just run:
    /opt/homebrew/opt/mysql/bin/mysqld_safe --datadir\=/opt/homebrew/var/mysql
    ogzo
        42
    ogzo  
       41 天前
    MAC 下 MySql8.0.17 优雅重置密码: https://313390.xyz/index.php/archives/55/
    cslive
        43
    cslive  
       41 天前
    还是 docker 快,说是手动安装的,我从 mysql 官网下的不带安装引导的,还要手动配置,安装一遍就受够了,后面知道了 docker 那是真的快
    billgong
        44
    billgong  
       41 天前
    刚刚在虚拟机里重新试了一下 Homebrew 的 MySQL 和 MariaDB ,似乎 MySQL 9 的策略又变了 - 默认 root 账户空密码,直接 mysql 或 mysql -uroot 就可以登入,不需要用 sudo ,默认通过 socket 连接。MariaDB 的本地 root 空密码则需要通过 sudo 才行。

    可能是因为 MySQL 还是希望用户通过 mysql_secure_installation 进行初始设置,而 MariaDB 已经初始化过了,cavaets 也没提到使用 mysql_secure_installation 初始化、改密码、去除匿名账户和 test 数据库等等
    brk43202
        46
    brk43202  
       41 天前
    @julyclyde 有先进的工具不用还在这和别人争辩茴的四种写法
    Jh1n
        47
    Jh1n  
       41 天前   ❤️ 4
    看了评论感觉 V 站技术水平不咋高啊
    QlanQ
        48
    QlanQ  
       41 天前
    看了评论感觉 V 站技术水平不咋高啊
    TimPeake
        49
    TimPeake  
       41 天前
    看了评论感觉 V 站技术水平不咋高啊
    zengguibo
        50
    zengguibo  
       41 天前
    你安装的时候看日志,日志里有提示的,不行就卸载后重装
    jamesjammy061
        51
    jamesjammy061  
       41 天前
    orbstack 跑 docker 吧,brew 的 pgsql 和 mysql 我一般用命令行
    qqjt
        52
    qqjt  
       41 天前
    这个问题得有十几年了吧,网上的资料不要太多哦
    GhostYs
        53
    GhostYs  
       41 天前
    为啥不查官方文档呢?

    https://dev.mysql.com/doc/refman/8.4/en/problems-connecting.html

    > After a fresh installation, if you try to log on to the server as root without using a password, you might get the following error message.(全新安装后,如果您尝试以不使用密码的方式登录服务器 root ,则可能会收到以下错误消息。)
    ```
    $> mysql -u root
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    ```

    > If you get the following error, it means that you are using an incorrect root password (如果出现以下错误,则表示您使用的 root 密码不正确)
    ```
    $> mysqladmin -u root -pxxxx ver
    Access denied for user 'root'@'localhost' (using password: YES)
    ```
    julyclyde
        54
    julyclyde  
       41 天前
    @billgong 首先,tcp 连接无视你是否 sudo ; unix domain socket 连接虽然理论上存在 sock 文件 mode 的问题,但经过查看代码,发现 mysqld 会特地把 sock 文件给 777 mode ,所以其实 sudo 也不是必须的。在此前提下,sudo 带来的其他副作用(比如.mysql_history 文件的路径/权限问题)是不可忽视的。不应该教唆使用 sudo

    你既然说“root 空密码就得通过 uid 0 连接”,那你应该给出实证。

    mariadb 必须 sudo 是咋回事呢? sock 文件的 mode 变了吗?

    另外你提到的 scoop 免疫是什么意思?
    julyclyde
        55
    julyclyde  
       41 天前
    @brk43202 你并没有掌握先进的工具啊
    你以为工具能解决一切
    但实际上还是要投入精力学习的
    你以为的只是宏大的各种现实情况其中的一个个例而已
    wynemo
        56
    wynemo  
       41 天前
    用一个 orbstack 装一个 mysql 的 docker 镜像吧
    cabing
        57
    cabing  
       41 天前
    deepseek 问下。
    saintatgod
        58
    saintatgod  
       40 天前
    这不就是安装时候没有注意 mysql 的默认密码吗,找不到就重新设吧,不知道这个问题是不是解决了。MySQL 8.0 以上,用下面这个步骤应该没有什么问题
    1. ```brew services stop mysql``` 停掉 MySQL 服务
    2. ```mysqld_safe --skip-grant-tables &``` 启动 mysql
    3. ```mysql -uroot ``` 就可以无密码进入了
    4. ```
    -- 刷新权限
    FLUSH PRIVILEGES;
    -- 重置 root 用户密码(替换为新密码,如 '123456')
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
    -- 刷新权限
    FLUSH PRIVILEGES;
    ```
    5. ``` exit ``` 退出 mysql
    6. ``` ps aux | grep mysqld_safe ``` 找到进程号,用 ``` kill -9 进程号 ``` 干掉进程
    7. ``` brew services start mysql ``` 启动 MySQL 服务,然后正常进入就可以。
    julyclyde
        59
    julyclyde  
       40 天前
    @saintatgod kill 数据库的时候建议不要-9
    偶尔会死的很难看
    webcape233
        60
    webcape233  
       40 天前 via iPhone
    跑一下 mysql_secure_installation
    它会提示
    是否设置 root 密码
    是否关闭远程 root 登录
    是否删除匿名帐号
    是否删除测试数据库
    saintatgod
        61
    saintatgod  
       40 天前
    @julyclyde 这个不算是 kill -9 数据库,这个你仔细看看, 而且他的问题又不是在生产环境,而且就算是在生产环境,做好数据库备份什么的,也不会有问题。
    julyclyde
        62
    julyclyde  
       39 天前
    @saintatgod 哦哦。看到了。是 kill safe 脚本是吧
    这种情况 mysqld 本体能关闭么??
    funcNVidia
        63
    funcNVidia  
       39 天前
    @julyclyde 现在他们有 AI 了,可以更懒了。然后还说你思维僵化,传统迂腐不肯接受新鲜事物
    funcNVidia
        64
    funcNVidia  
       39 天前
    既然是新安装的,不如找到配置文件,重新初始化数据库(
    8 楼也说的是,第一次安装会有个临时的密码
    julyclyde
        65
    julyclyde  
       38 天前
    @funcNVidia 幸好用 AI 的都会被封号
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5087 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:52 · PVG 14:52 · LAX 23:52 · JFK 02:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.