{{i18nTranslate('_layout.t11')}} {{i18nGetLang()==='zh' ? 'EN' : '中文'}}

# 安装MySQL

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

## 方法1：使用脚本安装MySQL

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

在Linux下可以尝试使用以下命令自动执行上述的安装步骤（前提是系统已经安装了 `curl` 和 `wget` 命令，非root用户请使用sudo执行）：

    curl -s https://goedge.cloud/install-mysql.sh | bash

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

    2022/11/03 11:45:08 finished
    installed successfully
    =======
    user: root
    password: ccdc61ea4dd0934bf3bfd4310517c41c
    dir: /usr/local/mysql

请将这段内容保存起来，防止丢失，其中：

- `user` - 用户名
- `password` - 密码
- `dir` - 安装位置

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

### 视频

可以在 https://www.bilibili.com/video/BV1xb42187AL/ 查看简单的操作视频。

### 常见问题处理

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

    /usr/local/mysql/bin/mysqld_safe &

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

    systemctl stop mysqld
    systemctl disable mysqld

然后手动启动数据库：

    /usr/local/mysql/bin/mysqld_safe &

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

### 卸载

如果你使用GoEdge脚本安装的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）：

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

点击框中的链接，浏览器将会下载，保存的文件类似于`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上，你可能需要先安装 `libaio` 和 `libncurses5`：

    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已经安装完成可以投入正常使用了。

## 常用命令

### 创建数据库

比如创建一个名为 `edges` 的数据库：

    CREATE DATABASE `edges` CHARSET utf8mb4;

其中：

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

### 创建新用户

要创建新用户，SQL语句如下：

    CREATE USER 'user'@'hostname' IDENTIFIED BY 'password';

其中：

- `user` - 要创建的用户名
- `hostname` - 授权的用户主机地址，有以下几种常见的主机地址：
  - 固定IP：`192.168.2.100`
  - 某个IP范围：`192.168.2.%`，这样 `192.168.2.1` 到 `192.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.1` 到 `192.168.2.255` 都可以连接
  - 所有IP地址均可：`%`，这样不限制客户端的IP地址

## 导出和恢复

### 导出

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

    mysqldump [数据库名] -u用户名 -p > 导出的目标SQL文件

如果用户名有密码，则命令执行后，需要输入密码。

以下是一个示例：

    mysqldump edges -uroot -p > /root/edges.sql

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

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

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

    mysqldump edges -uroot -p --ignore-table=edges.edgeHTTPAccessLogs_20220909 --ignore-table=edges.edgeHTTPAccessLogs_20220910 > /root/edges.sql

其中 `edges` 为数据库名。

### 恢复

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

    mysql -u用户名 -p 数据库名 < 导出的SQL文件

如果用户名有密码，则命令执行后，需要输入密码。

比如我们把 `/root/edges.sql` 导入 `edges` 数据库中：

    mysql -uroot -p edges < /root/edges.sql

其中 `edges` 示例数据库名称，`root` 是数据库用户名， `/root/edges.sql` 是导出的SQL文件名。这几个参数都需要根据你自己的实际环境进行修改。
{{i18nTranslate('_layout.t27')}}
{{i18nTranslate('_layout.t12')}}