Skip to content

Linux下配置MySQL

使用包管理工具安装

安装服务端

shell
# 安装最新版本
sudo apt install mysql-server

# 安装指定版本
sudo apt install mysql-server-8.0

安装完毕之后使用以下命令来验证是否安装成功

shell
sudo netstat -antp | grep mysql

安装连接工具

shell
sudo apt install mysql-client libmysqlclient-dev

搜索头、库文件

  • 头文件路径 /usr/include/mysql/
  • 库文件路径 /usr/lib/mysql/

启动MySQL服务

安装完成后,MySQL服务会自动启动,未启动则使用以下命令启动MySQL服务

bash
sudo systemctl start mysql

将MySQL设置为开机自启动

bash
sudo systemctl enable mysql

你可以使用以下命令来检查MySQL是否正在运行

bash
sudo systemctl status mysql

修改密码、权限

默认安装是没有设置密码的,需要我们自己设置密码。

bash
# 登录mysql,在默认安装时如果没有让我们设置密码,则直接回车就能登录成功。
sudo mysql -uroot -p
# 设置密码 mysql8.0
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
# 设置密码 mysql5.7
set password=password('新密码');
# 配置IP 5.7
grant all privileges on *.* to root@"%" identified by "密码";
# 刷新缓存
flush privileges;

注意

配置8.0版本实现所有IP都能访问

MySQL8.0版本把配置文件 my.cnf 拆分成mysql.cnf 和mysqld.cnf,我们需要修改的是mysqld.cnf文件:

bash
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

修改 bind-address,保存后重启MySQL即可。

bash
bind-address            = 0.0.0.0

重启MySQL重新加载一下配置:

bash
sudo systemctl restart mysql

测试

创建一个 mysql 测试账户,从其他主机使用图形化工具连接测试。

  1. 创建数据库
sql
create database workflow default charset utf8mb4;
  1. 创建用户
sql
create user 'test_sql'@'%' identified by '123456';
  1. 授予用户访问指定数据库的权限
sql
GRANT ALL PRIVILEGES	ON workflow.* TO 'test_sql'@'%';
ERROR 1410 (42000): You are not allowed to create a user with GRANT

遇到了错误,查资料得知mysql8的分配权限不能带密码隐式的创建账号了,要先创建账号再设置权限

sql
use mysql;
update user set host='%' where user='test_sql';
Grant all privileges on workflow.* to 'test_sql'@'%';
  1. 使用图形化工具连接测试。

卸载

在Ubuntu系统中,在彻底卸载MySQL之前,你需要确保你已经停止了MySQL服务,并且已经移除了所有相关的数据和配置文件。下面是一些步骤来彻底卸载MySQL:

  1. 停止MySQL服务

首先,你需要停止MySQL服务。打开终端并运行以下命令:

bash
sudo systemctl stop mysql
  1. 删除MySQL包

接下来,你可以使用apt-get命令来删除MySQL及其相关的包。运行以下命令:

bash
sudo apt-get remove --purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*

这个命令会删除MySQL服务器和客户端的包以及一些核心包。

  1. 自动删除不再需要的依赖包

删除MySQL包后,可能会有一些不再需要的依赖包。你可以使用以下命令来自动处理这些依赖:

bash
sudo apt-get autoremove
  1. 清理残留的配置文件

为了彻底清理,你还可以使用apt-get autoclean命令来删除已下载但未安装的包文件:

bash
sudo apt-get autoclean
  1. 删除MySQL数据目录(可选)

如果你还想要删除MySQL的数据目录(这通常位于/var/lib/mysql),你可以使用以下命令:

bash
sudo rm -rf /var/lib/mysql

警告: 这个命令会删除所有数据库文件。请确保你真的想这样做,并且已经备份了任何重要数据。

  1. 删除MySQL用户和组(可选)

最后,如果你想要删除与MySQL相关的用户和组(通常用户名为mysql),可以使用以下命令:

bash
sudo deluser --remove-home mysql
sudo delgroup mysql
  1. 验证卸载(可选)

为了验证MySQL是否完全卸载,你可以尝试启动MySQL服务,看是否会显示错误信息,表明没有找到MySQL服务:

bash
sudo systemctl start mysql

如果看到错误信息,如“Service mysql does not exist”,则表示MySQL已经完全卸载。

通过以上步骤,你应该能够彻底卸载MySQL及其相关组件。如果你使用的是MariaDB(Ubuntu的默认数据库),并且想要卸载MariaDB,可以按照类似的方法进行操作,只是包名会有所不同。例如:

bash
sudo apt-get remove --purge mariadb-server mariadb-client libmariadb*

然后同样执行autoremove和autoclean。

使用源码安装

  1. 下载源码包

    shell
    # 在要安装的机器上使用 wget 下载
    wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.34.tar.gz

  2. 解压源码包

    shell
    tar -zxvf mysql-boost-8.0.34.tar.gz
  3. 创建数据文件存放目录

    shell
    sudo mkdir -p /data/mysql
    
    cd mysql-8.0.34/
    # 新建目录,存放编译产生的中间文件。因为不允许在源码目录下进行编译
    mkdir builder
    cd builder/
    
    cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DMYSQL_TCP_PORT=3306 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_DEBUG=0 -DMYSQL_MAINTAINER_MODE=0 -DWITH_SYSTEMD=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=../boost

    cmake命令所使用的参数说明:

    • -DCMAKE_INSTALL_PREFIX=/usr/local/mysql:MySQL安装的根目录
    • -DMYSQL_DATADIR=/data/mysql:数据文件所存放的目录
    • -DSYSCONFDIR=/etc :MySQL配置文件所在目录
    • -DMYSQL_USER=mysql:MySQL服务的用户名
    • -DWITH_MYISAM_STORAGE_ENGINE=1:安装MyISAM引擎
    • -DWITH_INNOBASE_STORAGE_ENGINE=1:安装InnoDB引擎
    • -DWITH_ARCHIVE_STORAGE_ENGINE=1:安装Archive引擎
    • -DWITH_MEMORY_STORAGE_ENGINE=1:安装Memory引擎
    • -DWITH_FEDERATED_STORAGE_ENGINE=1:安装Federated引擎
    • -DWITH_PARTITION_STORAGE_ENGINE=1:安装Partition引擎
    • -DWITH_READLINE=1:MySQL的readline library
    • -DMYSQL_UNIX_ADDR=/tmp/mysql.sock:sock文件的路径
    • -DMYSQL_TCP_PORT=3306 :MySQL的监听端口
    • -DENABLED_LOCAL_INFILE=1:启用加载本地数据
    • -DENABLE_DOWNLOADS=1:编译时允许自主下载相关文件
    • -DEXTRA_CHARSETS=all :使MySQL支持所有的扩展字符
    • -DDEFAULT_CHARSET=utf8mb4:设置默认字符集为utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci:设置默认字符校对
    • -DWITH_DEBUG=0:禁用调试模式
    • -DMYSQL_MAINTAINER_MODE=0:是否启用mysql维护器特定的开发环境
    • -DDOWNLOAD_BOOST=1:允许在线更新boost库
    • -DWITH_BOOST=…/boost:指定boost安装路径

    具体参考官方文档:https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html

  4. 解决出现的问题

    • ssl

      shell
      sudo apt install libssl-dev
    • libncurses5-dev

      shell
      sudo apt install libncurses5-dev
    • pkg-config

      shell
      sudo apt install pkg-config
    • 出现以下情况即可进行下一步

  5. 编译并安装

    shell
    # 编译
    make -j4

    当出现一下情况即可进行下一步

    shell
    # 安装
    sudo make install
  6. 创建mysql用户及更改相应目录的属主

    shell
    sudo groupadd mysql
    sudo useradd -M -g mysql -s /sbin/nologin mysql
    sudo chown -R mysql:mysql /usr/local/mysql/
    sudo chown -R mysql:mysql /data/mysql/
  7. 编辑配置文件

    shell
    sudo vim /etc/my.cnf
    
    [mysqld]
    basedir=/usr/local/mysql
    datadir=/data/mysql
    socket=/tmp/mysql.sock
    
    [mysqld_safe]
    log-error=/var/log/mysqld/mysqld.log
    pid-file=/var/run/mysqld/mysql.pid
  8. 创建日志文件存放的目录和pid文件存放的目录,并赋权给mysql用户

    shell
    sudo mkdir -p /var/log/mysqld /var/run/mysqld
    sudo chown -R mysql:mysql /var/log/mysqld
    sudo chown -R mysql:mysql /var/run/mysqld
  9. 配置环境变量,方便使用MySQL的命令

    shell
    sudo vim /etc/profile
    # MySQL
    export MYSQL_HOME=/usr/local/mysql
    export PATH=$PATH:$MYSQL_HOME/bin
    
    sudo source /etc/profile
    sudo mysql --version  # 验证配置是否成功
    mysql  Ver 8.0.35-0ubuntu0.23.04.1 for Linux on aarch64 ((Ubuntu))
  10. 初始化数据库

    执行如下命令

    shell
    sudo -i #切换到 root 用户
    mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql

    初始化成功后会生成root账户的默认密码。将该密码复制并保存,因为后面需要使用该密码登录到MySQL中修改密码。

  11. 拷贝启动文件

    shell
    sudo cp ./scripts/mysqld.service /usr/lib/systemd/system/mysqld.service 
    sudo chown 755 /usr/lib/systemd/system/mysqld.service
  12. 查看3306端口是否已正常监听

    shell
    # netstat -lntp 
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN      505/systemd-resolve 
    tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      505/systemd-resolve 
    tcp6       0      0 :::22                   :::*                    LISTEN      1/init              
    root@ubuntu:/home/zm/packages/mysql-8.0.34/builder# systemctl start mysqld
    root@ubuntu:/home/zm/packages/mysql-8.0.34/builder# netstat -lntp 
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN      505/systemd-resolve 
    tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      505/systemd-resolve 
    tcp6       0      0 :::22                   :::*                    LISTEN      1/init              
    tcp6       0      0 :::3306                 :::*                    LISTEN      10344/mysqld        
    tcp6       0      0 :::33060                :::*                    LISTEN      10344/mysqld
  13. 登录到 mysql

    shell
    $ mysql -uroot -p0uaQ:bw*s5iP
    -bash: syntax error near unexpected token `('
    $ mysql -uroot -p"0uaQ:bw*s5iP"

    如果登录的时间出现

    shell
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

    修改/etc/my.cnf文件,添加以下内容

    shell
    [mysql]
    default-character-set=utf8
    socket=/tmp/mysql.sock

    修改完后重启 mysql

    shell
    systemctl restart mysqld.service
  14. 重置密码及开放远程登录

    sql
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';  # 重置密码
    mysql> use mysql;
    mysql> update user set host ='%' where user='root';  # 开放远程登录
    mysql> FLUSH PRIVILEGES;  # 刷新修改

    开放远程登录要在etc/mysql/目录下修改mysqld.cnf中bind-address修改为0.0.0.0,设置为0.0.0.0才允许外部机器访问。

  15. 忘记密码解决办法

    cpp
    sudo vim /etc/my.cnf

    在 mysqld 中添加skip-grant-tables

    shell
    [mysqld]
    basedir=/usr/local/mysql
    datadir=/data/mysql
    socket=/tmp/mysql.sock
    skip-grant-tables # 跳过授权表,忘记密码时使用此行
    shell
    systemctl restart mysqld

    之后我们进入mysql里面,直接输入mysql回车就行

    sql
    mysql>use mysql;  
    mysql>update user set authentication_string='新密码' where user='root';
    mysql>exit

    再次编辑mysql配置文件将添加的#skip-grant-tables #注释掉

    再次重启MySQL服务