Linux下配置MySQL
使用包管理工具安装
安装服务端
# 安装最新版本
sudo apt install mysql-server
# 安装指定版本
sudo apt install mysql-server-8.0
安装完毕之后使用以下命令来验证是否安装成功
sudo netstat -antp | grep mysql
安装连接工具
sudo apt install mysql-client libmysqlclient-dev
搜索头、库文件
- 头文件路径
/usr/include/mysql/
- 库文件路径
/usr/lib/mysql/
启动MySQL服务
安装完成后,MySQL服务会自动启动,未启动则使用以下命令启动MySQL服务
sudo systemctl start mysql
将MySQL设置为开机自启动
sudo systemctl enable mysql
你可以使用以下命令来检查MySQL是否正在运行
sudo systemctl status mysql
修改密码、权限
默认安装是没有设置密码的,需要我们自己设置密码。
# 登录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文件:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
修改 bind-address,保存后重启MySQL即可。
bind-address = 0.0.0.0
重启MySQL重新加载一下配置:
sudo systemctl restart mysql
测试
创建一个 mysql 测试账户,从其他主机使用图形化工具连接测试。
- 创建数据库
create database workflow default charset utf8mb4;
- 创建用户
create user 'test_sql'@'%' identified by '123456';
- 授予用户访问指定数据库的权限
GRANT ALL PRIVILEGES ON workflow.* TO 'test_sql'@'%';
ERROR 1410 (42000): You are not allowed to create a user with GRANT
遇到了错误,查资料得知mysql8的分配权限不能带密码隐式的创建账号了,要先创建账号再设置权限
use mysql;
update user set host='%' where user='test_sql';
Grant all privileges on workflow.* to 'test_sql'@'%';
- 使用图形化工具连接测试。
卸载
在Ubuntu系统中,在彻底卸载MySQL之前,你需要确保你已经停止了MySQL服务,并且已经移除了所有相关的数据和配置文件。下面是一些步骤来彻底卸载MySQL:
- 停止MySQL服务
首先,你需要停止MySQL服务。打开终端并运行以下命令:
sudo systemctl stop mysql
- 删除MySQL包
接下来,你可以使用apt-get命令来删除MySQL及其相关的包。运行以下命令:
sudo apt-get remove --purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*
这个命令会删除MySQL服务器和客户端的包以及一些核心包。
- 自动删除不再需要的依赖包
删除MySQL包后,可能会有一些不再需要的依赖包。你可以使用以下命令来自动处理这些依赖:
sudo apt-get autoremove
- 清理残留的配置文件
为了彻底清理,你还可以使用apt-get autoclean命令来删除已下载但未安装的包文件:
sudo apt-get autoclean
- 删除MySQL数据目录(可选)
如果你还想要删除MySQL的数据目录(这通常位于/var/lib/mysql),你可以使用以下命令:
sudo rm -rf /var/lib/mysql
警告: 这个命令会删除所有数据库文件。请确保你真的想这样做,并且已经备份了任何重要数据。
- 删除MySQL用户和组(可选)
最后,如果你想要删除与MySQL相关的用户和组(通常用户名为mysql),可以使用以下命令:
sudo deluser --remove-home mysql
sudo delgroup mysql
- 验证卸载(可选)
为了验证MySQL是否完全卸载,你可以尝试启动MySQL服务,看是否会显示错误信息,表明没有找到MySQL服务:
sudo systemctl start mysql
如果看到错误信息,如“Service mysql does not exist”,则表示MySQL已经完全卸载。
通过以上步骤,你应该能够彻底卸载MySQL及其相关组件。如果你使用的是MariaDB(Ubuntu的默认数据库),并且想要卸载MariaDB,可以按照类似的方法进行操作,只是包名会有所不同。例如:
sudo apt-get remove --purge mariadb-server mariadb-client libmariadb*
然后同样执行autoremove和autoclean。
使用源码安装
下载源码包
shell# 在要安装的机器上使用 wget 下载 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.34.tar.gz
解压源码包
shelltar -zxvf mysql-boost-8.0.34.tar.gz
创建数据文件存放目录
shellsudo 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
解决出现的问题
ssl
shellsudo apt install libssl-dev
libncurses5-dev
shellsudo apt install libncurses5-dev
pkg-config
shellsudo apt install pkg-config
出现以下情况即可进行下一步
编译并安装
shell# 编译 make -j4
当出现一下情况即可进行下一步
shell# 安装 sudo make install
创建mysql用户及更改相应目录的属主
shellsudo 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/
编辑配置文件
shellsudo 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
创建日志文件存放的目录和pid文件存放的目录,并赋权给mysql用户
shellsudo mkdir -p /var/log/mysqld /var/run/mysqld sudo chown -R mysql:mysql /var/log/mysqld sudo chown -R mysql:mysql /var/run/mysqld
配置环境变量,方便使用MySQL的命令
shellsudo 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))
初始化数据库
执行如下命令
shellsudo -i #切换到 root 用户 mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql
初始化成功后会生成root账户的默认密码。将该密码复制并保存,因为后面需要使用该密码登录到MySQL中修改密码。
拷贝启动文件
shellsudo cp ./scripts/mysqld.service /usr/lib/systemd/system/mysqld.service sudo chown 755 /usr/lib/systemd/system/mysqld.service
查看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
登录到 mysql
shell$ mysql -uroot -p0uaQ:bw*s5iP -bash: syntax error near unexpected token `(' $ mysql -uroot -p"0uaQ:bw*s5iP"
如果登录的时间出现
shellERROR 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
shellsystemctl restart mysqld.service
重置密码及开放远程登录
sqlmysql> 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才允许外部机器访问。
忘记密码解决办法
cppsudo vim /etc/my.cnf
在 mysqld 中添加skip-grant-tables
shell[mysqld] basedir=/usr/local/mysql datadir=/data/mysql socket=/tmp/mysql.sock skip-grant-tables # 跳过授权表,忘记密码时使用此行
shellsystemctl restart mysqld
之后我们进入mysql里面,直接输入mysql回车就行
sqlmysql>use mysql; mysql>update user set authentication_string='新密码' where user='root'; mysql>exit
再次编辑mysql配置文件将添加的
#skip-grant-tables
#注释掉再次重启MySQL服务