跳转至

MySQL

下载地址参考:https://dev.mysql.com/downloads/mysql/

基础

apt-get update
apt-get install -y libncurses5-dev libssl-dev bison cmake make gcc g++ wget pkg-config libfido2-dev
screen -R develop

下载带Boost库的MySQL源码

wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.6.tar.gz && tar xzf mysql-8.4.6.tar.gz

新增用户组

# 添加组
groupadd mysql
# 添加用户
useradd -g mysql -s /sbin/nologin mysql
#查看新增用户
id mysql

编译MySQL

使用cmake来配置编译选项

cd mysql-8.4.6
mkdir mysql-build && cd mysql-build
cmake /root/mysql-8.4.6 -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
    -DMYSQL_DATADIR=/usr/local/mysql/data \
    -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    -DWITH_FEDERATED_STORAGE_ENGINE=1 \
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
    -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
    -DENABLED_LOCAL_INFILE=1 \
    -DDEFAULT_CHARSET=utf8mb4 \
    -DWITH_FIDO=system \
    -DDEFAULT_COLLATION=utf8mb4_general_ci

编译&安裝MySQL:

make -j$(nproc) && make install
#make -j1

配置MySQL

tee /etc/my.cnf <<EOF
[client]
port = 3306
socket = /tmp/mysql.sock

[mysql]
no-auto-rehash

[mysqld]
port = 3306
bind-address = 127.0.0.1
socket = /tmp/mysql.sock

basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
pid-file = /usr/local/mysql/data/mysql.pid
user = mysql
server-id = 1

init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

skip-name-resolve
back_log = 300

max_connections = 300
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 1024
max_allowed_packet = 500M
binlog_cache_size = 1M
# 根據實際需求調整
max_heap_table_size = 64M
tmp_table_size = 64M

# 根據實際需求調整
read_buffer_size = 16M
read_rnd_buffer_size = 32M
sort_buffer_size = 32M
join_buffer_size = 32M
key_buffer_size = 32M

thread_cache_size = 8
ft_min_word_len = 4

log_bin = mysql-bin
binlog_expire_logs_seconds = 604800

log_error = /usr/local/mysql/data/mysql-error.log
# 建議開啟慢查詢日誌
slow_query_log = 1       
long_query_time = 2     # 設定慢查詢時間閾值,例如 2 秒
slow_query_log_file = /usr/local/mysql/data/mysql-slow.log

# 建議開啟 performance_schema 以便監控性能
performance_schema = 1   

explicit_defaults_for_timestamp
skip-external-locking
default_storage_engine = InnoDB

innodb_file_per_table = 1
innodb_open_files = 500
#  innodb_buffer_pool_size 設定為可用內存的 50% - 75%
innodb_buffer_pool_size = 2G
innodb_log_file_size = 1G
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

innodb_write_io_threads = 4
innodb_read_io_threads = 4

# 根據實際需求調整
innodb_thread_concurrency = 8
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16M
innodb_redo_log_capacity = 96M
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120

# 根據實際需求調整
bulk_insert_buffer_size = 32M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 10G

interactive_timeout = 28800
wait_timeout = 28800

[mysqldump]
quick
max_allowed_packet = 500M

[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
EOF

初始化数据库

初始化数据库并设置权限。

chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --upgrade=AUTO

设置系统服务

创建一个系统服务文件,使MySQL可以作为服务启动。

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
update-rc.d mysqld defaults

启动MySQL服务

service mysqld start
# 自启
systemctl enable mysqld.service
systemctl status mysqld.service
systemctl restart mysqld.service

后续配置

现在MySQL已经安装并运行了,您可能需要运行mysql_secure_installation脚本来设置root用户密码并按需进行其他安全设置。

sudo /usr/local/mysql/bin/mysql_secure_installation

配置内容:

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Connecting to MySQL using a blank password:
这表明脚本正在尝试使用空密码连接到 MySQL 服务器。这是因为在初始安装后,root 用户默认没有密码。

VALIDATE PASSWORD COMPONENT:
这是 MySQL 的一个功能,用于检查密码的强度。如果启用,它将强制用户只能设置足够安全的密码。如果您选择“是(y/Y)”,则会启用此功能,如果选择其他任何键,则不会启用。

---

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
是关于 MySQL 的密码验证策略的设置。MySQL 提供了三个级别的密码强度验证选项,以帮助确保数据库的安全性。这些选项定义了密码必须符合的规则:

LOW:
长度:密码长度必须大于或等于 8 个字符。
这是最基本的密码安全级别,只要求密码有一定的长度。
MEDIUM:
长度:密码长度必须大于或等于 8 个字符。
字符类型:密码必须包含数字、大小写字母和特殊字符。
这个级别在密码长度的基础上增加了字符多样性的要求,提高了密码的复杂度。
STRONG:
长度:密码长度必须大于或等于 8 个字符。
字符类型:密码必须包含数字、大小写字母、特殊字符,并且不包含字典文件中的单词。
这是最高的安全级别,除了长度和字符多样性外,还检查密码是否包含常见的、易于猜测的单词。

---

Estimated strength of the password: 50 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : 
于评估您为 MySQL root 用户设置的密码强度。当您在配置过程中输入密码时,MySQL 会根据其内置的评估规则估计密码的强度,并给出一个分数。这个分数是一个从 0 到 100 的数值,反映了密码的安全性。

---

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : 

用于提升MySQL安装的安全性。在这个特定的步骤中,脚本解释了MySQL默认安装中存在的“匿名用户”账户,并询问您是否要移除它。

---

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : 

默认情况下,出于安全考虑,MySQL的root用户仅被允许从本地机器(即'localhost')登录。这个设置可以防止远程用户尝试通过网络猜测或暴力破解root账户的密码。

Disallow root login remotely?:这个问题询问您是否要禁止root用户从远程地址登录到MySQL服务器。这是一个重要的安全措施,特别是在面对公共或不安全网络时。

如果您选择 禁止 root用户从远程登录,可以按 y 或 Y。这意味着root用户只能从本地机器登录,增加了安全性。
如果您选择允许root用户从远程登录,可以按任何其他键。请注意,这可能会增加安全风险,尤其是如果密码强度不足或者服务器暴露在公共网络上时。

---

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : 

MySQL 默认安装时随带的名为 'test' 的数据库。

关于 'test' 数据库:MySQL 默认创建一个名为 'test' 的数据库,这个数据库可以被任何用户访问,主要目的是为了方便测试。在这个数据库中,用户可以进行实验和学习,而不会影响到其他数据库。

移除 'test' 数据库的建议:与匿名用户类似,这个 'test' 数据库在生产环境中可能会构成安全风险,因为它允许任何人访问。因此,通常建议在将MySQL服务器用于生产环境之前移除这个数据库。

操作提示:

如果您选择 移除 'test' 数据库及其访问权限,可以按 y 或 Y。
如果您决定保留 'test' 数据库,可以按任何其他键。

---

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : 

出现在脚本的最后阶段。它与重新加载 MySQL 的权限表格有关。

背景:在您通过 mysql_secure_installation 脚本做出一系列安全相关的更改(如移除匿名用户、删除'test'数据库、更改root用户的远程访问权限等)后,这些更改需要更新到MySQL的权限系统中才能生效。

重新加载权限表格:此步骤是为了确保您所做的所有更改立即生效。权限表格包含了用户、权限和其他安全相关的信息。重新加载这些表格意味着所有的安全更改将被应用并立即生效。

操作提示:

如果您选择 现在重新加载权限表格,请按 y 或 Y。这通常是推荐的操作,因为它确保了您的安全设置更改立即生效。
如果您选择不重新加载权限表格,可以按任何其他键。这意味着您所做的更改将在下次MySQL重启时生效。

添加路径

临时添加到 PATH 在当前会话中,您可以临时将 MySQL 的 bin 目录添加到 PATH。这样做可以直接调用 mysql 而不需要指定完整路径。运行以下命令:

export PATH=$PATH:/usr/local/mysql/bin

永久添加到 PATH 为了在任何新的终端会话中都能够访问 mysql 命令,您需要将 /usr/local/mysql/bin 永久添加到 PATH。这通常通过在您的 shell 配置文件(如 .bashrc 或 .bash_profile)中添加上面的 export 命令来实现。

# 编辑
nano ~/.bashrc
# 添加内容
export PATH=$PATH:/usr/local/mysql/bin
#刷新并生效
source ~/.bashrc 

用户操作

-- 查看所有用户的权限:
SELECT User, Host, Select_priv, Insert_priv, Update_priv, Delete_priv, Grant_priv FROM mysql.user;
-- 默认情况下,用户(如root)可能仅限于从localhost访问。要允许用户从任何主机远程连接,您可以使用以下命令(请谨慎使用,特别是对root用户):
UPDATE mysql.user SET Host = '%' WHERE User = 'your_username' AND Host = 'localhost';
FLUSH PRIVILEGES;

确保MySQL配置允许远程连接: 编辑MySQL配置文件(通常是/etc/mysql/my.cnf或/etc/my.cnf),确保bind-address行设置为允许远程连接:bind-address = 0.0.0.0 这允许MySQL监听所有网络接口。编辑后,需要重启MySQL服务使更改生效 : sudo systemctl restart mysql

-- 新增用户,并给予权限
CREATE USER 'admin'@'127.0.0.1' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1';
FLUSH PRIVILEGES;

升級

# 停止MySQL服務
systemctl stop mysql
# 重新编译安装
# 覆蓋新版本配置文件後啟動服務:
systemctl start mysql
# 在 MySQL 8.0.16 及之後的版本(包括 8.4.x),mysql_upgrade 工具已經被棄用,且大部分升級任務會在你啟動新版本 mysqld 時自動完成,所以你不需要再手動執行 mysql_upgrade。
# mysql_upgrade -u root -p
mysqlcheck --all-databases --check-upgrade --auto-repair -u root -p

wget https://dev.mysql.com/get/Downloads/Shell-8.4/mysql-shell-8.4.5-src.tar.gz tar xzf mysql-shell-8.4.5-src.tar.gz