mac 使用 brew 安装 mysql,登录时报错: ERROR 1045: Access denied for user ‘root‘@‘localhost‘ (using password: YES) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
KaneW95
V2EX    程序员

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

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

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

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

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

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

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

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

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

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

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

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

    我这里遭遇奇怪现象了。我看了看我自己的,sock 文件 0777 ,但是 systemd show 显示 UMask 才 0022
    我先研究研究我自己的烂摊子去吧
    julyclyde
        29
    julyclyde  
       224 天前
    @ZeekChatCom
    @billgong 教唆 sudo 一定是错的。我坚持
    MoYi123
        30
    MoYi123  
       224 天前
    brew 装的 mysql 确实挺神秘的, 我几个月前想给家里的 kodi 配置 mysql 同步也搞了好久.
    SDYY
        31
    SDYY  
       224 天前
    mysql5.x 和 8.+ 密码加密方式不一样导致的吧
    julyclyde
        32
    julyclyde  
       224 天前
    @SDYY 旧数据升级才会发生加密方式不同的问题
    这里问的应该是新装
    lscho
        33
    lscho  
       224 天前
    不是,你们用 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  
       224 天前
    mysql_server 代码比较复杂,我也没读过啊。简单 grep 了一下
    在 sql/conn_handler/socket_connection.cc 文件中有一句 umask(0)应该是决定了 sock 文件 0777 的因素
    所以本地访问 mysql 必然是不需要 sudo 的
    davidqw
        35
    davidqw  
       224 天前
    为何不用官网安装包呢,一步步自定义配置比较省心,系统设置里也有面板来配置和开启/关闭服务器 https://dev.mysql.com/downloads/mysql/
    nutting
        36
    nutting  
       224 天前
    我用 orbstack 的 docker 装 arm 的 mysql ,数据映射出来,很香,同步到别的机器也很方便
    billgong
        37
    billgong  
       224 天前
    @julyclyde #25 用 sudo 是对的,因为我说了通过 TCP 用 root 空密码默认有限制,而 mysql 命令是通过 socket 连接的,root 空密码就得通过 uid 0 连接。

    你完全可与取消限制,Homebrew 的 cavets 说了,可以运行 mysql_secure_installation 配置
    billgong
        38
    billgong  
       224 天前
    @julyclyde Homebrew 环境下“教唆” sudo 确实不对,但我没“教唆”
    Homebrew 也不像 scoop 那样能完全免疫 sudo 的使用,要实事求是
    billgong
        39
    billgong  
       224 天前
    @SDYY #31 MySQL 8 刚开始的时候有这个问题,后来 Homebrew distro 好像又单独从 sha 换回 native 了,默认没这个问题了
    billgong
        40
    billgong  
       224 天前
    @lscho #33 相信我,绝大多数人运行命令都不看输出
    AlbertGuo
        41
    AlbertGuo  
       224 天前
    @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  
       224 天前
    MAC 下 MySql8.0.17 优雅重置密码: https://313390.xyz/index.php/archives/55/
    cslive
        43
    cslive  
       224 天前
    还是 docker 快,说是手动安装的,我从 mysql 官网下的不带安装引导的,还要手动配置,安装一遍就受够了,后面知道了 docker 那是真的快
    billgong
        44
    billgong  
       223 天前
    刚刚在虚拟机里重新试了一下 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  
       223 天前
    @julyclyde 有先进的工具不用还在这和别人争辩茴的四种写法
    Jh1n
        47
    Jh1n  
       223 天前   4
    看了评论感觉 V 站技术水平不咋高啊
    QlanQ
        48
    QlanQ  
       223 天前
    看了评论感觉 V 站技术水平不咋高啊
    TimPeake
        49
    TimPeake  
       223 天前
    看了评论感觉 V 站技术水平不咋高啊
    zengguibo
        50
    zengguibo  
       223 天前
    你安装的时候看日志,日志里有提示的,不行就卸载后重装
    jamesjammy061
        51
    jamesjammy061  
       223 天前
    orbstack 跑 docker 吧,brew 的 pgsql 和 mysql 我一般用命令行
    qqjt
        52
    qqjt  
       223 天前
    这个问题得有十几年了吧,网上的资料不要太多哦
    GhostYs
        53
    GhostYs  
       223 天前
    为啥不查官方文档呢?

    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  
       223 天前
    @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  
       223 天前
    @brk43202 你并没有掌握先进的工具啊
    你以为工具能解决一切
    但实际上还是要投入精力学习的
    你以为的只是宏大的各种现实情况其中的一个个例而已
    wynemo
        56
    wynemo  
       223 天前
    用一个 orbstack 装一个 mysql 的 docker 镜像吧
    cabing
        57
    cabing  
       223 天前
    deepseek 问下。
    saintatgod
        58
    saintatgod  
       223 天前
    这不就是安装时候没有注意 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  
       223 天前
    @saintatgod kill 数据库的时候建议不要-9
    偶尔会死的很难看
    webcape233
        60
    webcape233  
       223 天前 via iPhone
    跑一下 mysql_secure_installation
    它会提示
    是否设置 root 密码
    是否关闭远程 root 登录
    是否删除匿名帐号
    是否删除测试数据库
    saintatgod
        61
    saintatgod  
       223 天前
    @julyclyde 这个不算是 kill -9 数据库,这个你仔细看看, 而且他的问题又不是在生产环境,而且就算是在生产环境,做好数据库备份什么的,也不会有问题。
    julyclyde
        62
    julyclyde  
       222 天前
    @saintatgod 哦哦。看到了。是 kill safe 脚本是吧
    这种情况 mysqld 本体能关闭么??
    funcNVidia
        63
    funcNVidia  
       221 天前
    @julyclyde 现在他们有 AI 了,可以更懒了。然后还说你思维僵化,传统迂腐不肯接受新鲜事物
    funcNVidia
        64
    funcNVidia  
       221 天前
    既然是新安装的,不如找到配置文件,重新初始化数据库(
    8 楼也说的是,第一次安装会有个临时的密码
    julyclyde
        65
    julyclyde  
       221 天前
    @funcNVidia 幸好用 AI 的都会被封号
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4502 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 96ms UTC 01:06 PVG 09:06 LAX 17:06 JFK 20:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86