安装MySQL

本文讲述如何在Linux系统中如何安装MySQL。

方法1:使用脚本安装MySQL

此方法目前仅限于x86_64系统。

在Linux下可以尝试使用以下命令自动执行上述的安装步骤(前提是系统已经安装了 curlwget 命令,非root用户请使用sudo执行):

curl -s https://flex.dd.ci/install-mysql.sh | bash

安装成功后,控制台会输出类似以下内容:

2022/11/03 11:45:08 finished
installed successfully
=======
user: root
password: ccdc61ea4dd0934bf3bfd4310517c41c
dir: /usr/local/mysql
请将这段内容保存起来,防止丢失,其中:

  • user - 用户名
  • password - 密码(每次安装生成的密码都会有所不同)
  • dir - 安装位置

如果安装失败,请截图并在CDN相关群组中报告此问题,以寻求帮助。

常见问题处理

如果在服务器重启时没有正常启动我们通过脚本安装的数据库,可以使用以下命令启动:

/usr/local/mysql/bin/mysqld_safe &

如果发现数据库总是间歇性拒绝连接,可能是系统服务发生了异常,可以使用以下命令停用系统服务:

systemctl stop mysqld
systemctl disable mysqld
然后手动启动数据库:
/usr/local/mysql/bin/mysqld_safe &

如果忘记了初始密码,可以在 /usr/local/mysql/generated-password.txt 文件中找到。

卸载

如果你使用CDN脚本安装的MySQL并需要卸载的话,可以按照以下步骤操作:

  1. 停止服务:
    systemctl stop mysqld
    systemctl disable mysqld
    systemctl daemon-reload
  2. 检查进程是否存在,执行:
    ps ax|grep mysqld
    如果出现以下内容:
    12581 ?        S      0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
    12804 ?        Sl    16:30 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=localhost.localdomain.err --pid-file=localhost.localdomain.pid --port=3306
    14789 pts/1    S+     0:00 grep --color=auto mysqld
    说明mysqld进程仍然存在,你可以手动停止:
    kill 12804
    kill 12581
    请将kill命令后的数字替换成你实际ps命令查询后的结果。操作后,请继续使用ps命令确认进程是否存在;
  3. 删除MySQL目录:
    rm -rf /usr/local/mysql
    删除后,确认目录是否仍然存在:
    ls /usr/local/mysql
    如果出现:
    cannot access '/usr/local/mysql': No such file or directory
    就说明删除成功了
  4. 删除my.cnf配置文件:
    rm -f /etc/my.cnf

方法2:手动安装MySQL

步骤1:下载

https://dev.mysql.com/downloads/mysql/ 下载最新的MySQL社区版本,记得操作系统选择为Linux - Generic,OS Version选为Linux - Generic (glibc 2.17)(x86, 64-bit)(如果是32位的,请选择32-bit):

Install1.png

点击上图中的”Download”按钮,进入下个页面:

Install2.png

点击框中的链接,浏览器将会下载,保存的文件类似于mysql-x.x.x-linux-glibc2.17-x86_64-minimal-rebuild.tar.xz

步骤2:解压

将文件上传到服务器,上传到的目录为你要选择的安装目录,比如 /usr/local 目录下,并记下这个目录,将来启动或者停止MySQL的时候都需要用到,然后使用tar命令解压:

cd $安装文件所在目录
tar -xJvf mysql-x.x.x-linux-glibc2.17-x86_64-minimal-rebuild.tar.xz
mv mysql-x.x.x-linux-glibc2.17-x86_64-minimal-rebuild mysql8

将其中的x.x.x替换成实际的版本号。

步骤3:初始化

先准备mysql用户和数据库存放目录data/

cd mysql8  # 进入MySQL安装目录,以下操作都会在目录下进行
groupadd mysql
useradd mysql -g mysql
mkdir data
chown mysql:mysql data

将以前的MySQL配置文件(/etc/my.cnf)更名,以免影响当前新的MySQL的运行:

mv /etc/my.cnf /etc/my.cnf.bk
运行后,如果提示 mv: cannot stat ‘/etc/my.cnf’: No such file or directory 可以忽略

执行初始化:

bin/mysqld --initialize --user=mysql
将会输出类似于以下的信息:
2021-09-25T08:26:45.321239Z 0 [System] [MY-013169] [Server] /opt/mysql8/bin/mysqld (mysqld 8.0.26) initializing of server in progress as process 5964
2021-09-25T08:26:45.330015Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-09-25T08:26:45.616649Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-09-25T08:26:46.420358Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2021-09-25T08:26:46.420949Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2021-09-25T08:26:46.579100Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: d_qPgidGM2tl
其中A temporary password is generated for root@localhost: d_qPgidGM2tl 中的一行的最后数据(d_qPgidGM2tl部分)是MySQL临时密码,每次初始化的结果都会不同,请记住这个密码。

可以使用 ls 命令查看 data/ 目录下是否有内容:

ls data
正常会输出类似于以下的文件:
auto.cnf    client-cert.pem    #ib_16384_1.dblwr  #innodb_redo/  mysql.ibd            public_key.pem   sys/ ...
如果没有这些文件,说明你没有把老的MySQL配置文件(/etc/my.cnf)更名。

Ubuntu和Debian

在 Ubuntu 和 Debian上,你可能需要先安装 libaiolibncurses5

apt -y install libaio1
apt -y install libncurses5

步骤4:创建my.cnf

创建 /etc/my.cnf 文件,并写入内容:

[mysqld]
port=3306
basedir="/usr/local/mysql8"
datadir="/usr/local/mysql8/data"

max_connections=256
innodb_flush_log_at_trx_commit=2
max_prepared_stmt_count=65535
binlog_cache_size=1M
binlog_stmt_cache_size=1M
thread_cache_size=32
binlog_expire_logs_seconds=604800
innodb_sort_buffer_size=8M
innodb_buffer_pool_size=1G

其中:

  • 请根据你安装的实际目录来修改其中的 basedir(安装目录) 和 datadir (数据目录) 两个参数
  • innodb_buffer_pool_size - 可以设置为系统内存的一半,比如16G的内存系统,可以为此值设置为8G;如果你的系统时独立作为数据库使用的,此值可以设置为系统内存总量的80%。

步骤5:启动

使用以下命令启动已初始化的MySQL:

bin/mysqld_safe --user=mysql &

不如意外的话,应该可以在进程中看到启动的mysqld,类似于:

[root@web001 mysql8]# ps ax|grep mysql
 6220 pts/0    S      0:00 /bin/sh bin/mysqld_safe --user=mysql
 6290 pts/0    Sl     0:00 /opt/mysql8/bin/mysqld --basedir=/opt/mysql8 --datadir=/opt/mysql8/data --plugin-dir=/opt/mysql8/lib/plugin --usermysql --log-error=web001.err --pid-file=web001.pid

步骤6:修改初始密码

使用以下命令登录MySQL控制台:

bin/mysql -uroot -p
输入步骤3生成的临时密码,可以进入MySQL控制台。

使用以下命令修改默认密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

其中的123456就是要修改成的新密码,你可以换成别的。

修改完成之后,可以使用quit;退出MySQL控制台,然后重新使用命令重新登录控制台,来测试新的密码是否修改成功。

至此,整个MySQL已经安装完成可以投入正常使用了。

常用命令

创建数据库

比如创建一个名为 clouds 的数据库:

CREATE DATABASE `clouds` CHARSET utf8mb4;
其中:

  • clouds - 我们创建的数据库名
  • utf8mb4 - 默认字符集

创建新用户

要创建新用户,SQL语句如下:

CREATE USER 'user'@'hostname' IDENTIFIED BY 'password';
其中:

  • user - 要创建的用户名
  • hostname - 授权的用户主机地址,有以下几种常见的主机地址:
    • 固定IP:192.168.2.100
    • 某个IP范围:192.168.2.%,这样 192.168.2.1192.168.2.255 都可以连接
    • 所有IP地址均可:%,这样不限制客户端的IP地址
  • password - 用户密码

删除用户

要删除一个已有用户,SQL语句如下:

DROP USER 'user';
其中:

  • user - 要删除的用户名

授权

要给一个用户授权,SQL语句如下:

GRANT ALL PRIVILEGES ON 数据库名.* TO 'user'@'hostname';
其中:

  • 数据库名 - 当前用户可以管理的数据库名称,如果是 * 通配符表示所有的数据库
  • user - 要授权的用户名
  • hostname - 授权的用户主机地址,有以下几种常见的主机地址:
    • 固定IP:192.168.2.100
    • 某个IP范围:192.168.2.%,这样 192.168.2.1192.168.2.255 都可以连接
    • 所有IP地址均可:%,这样不限制客户端的IP地址

导出和恢复

导出

可以使用 mysqldump 命令导出一个数据库:

mysqldump [数据库名] -u用户名 -p > 导出的目标SQL文件
如果用户名有密码,则命令执行后,需要输入密码。

以下是一个示例:

mysqldump clouds -uroot -p > /root/clouds.sql
其中 clouds 示例数据库名称,root 是数据库用户名, /root/clouds.sql 是导出的目标SQL文件名。这几个参数都需要根据你自己的实际环境进行修改。

注意:如果访问日志过多,请先删除/清空访问日志再导出,功能在:”系统设置”–“手动清理”–“数据库”–“手动清理”。

可以使用 --ignore-table 来忽略某些不需要导出的表

mysqldump clouds -uroot -p --ignore-table=clouds.cloud_http_access_logs_20240810 --ignore-table=clouds.cloud_http_access_logs_20240811 > /root/clouds.sql
其中 clouds 为数据库名。

恢复

可以使用 mysql 命令恢复一个数据库:

mysql -u用户名 -p 数据库名 < 导出的SQL文件
如果用户名有密码,则命令执行后,需要输入密码。

比如我们把 /root/clouds.sql 导入 clouds 数据库中:

mysql -uroot -p clouds < /root/clouds.sql
其中 clouds 示例数据库名称,root 是数据库用户名, /root/clouds.sql 是导出的SQL文件名。这几个参数都需要根据你自己的实际环境进行修改。