1 Linux快速安装MySQL8.0

1.1 卸载原有的MySQL

通过以下步骤,找出 Linux 系统上已安装的所有 MySQL 版本并完全卸载,确保不残留任何 MySQL 相关文件。

# 1. 创建脚本保存目录并进入
mkdir /data/script
cd /data/script
# 2. 创建并编辑MySQL完全卸载脚本,并保存编辑
vim mysql_uninstall.sh
# 3. 授予脚本可执行权限
chmod +x mysql-uninstall.sh
# 4. 执行脚本
sh mysql-uninstall.sh 

mysql-uninstall.sh 内容如下:

#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color

# 错误处理函数
handle_error() {
    echo -e "${RED}错误:${NC} $1" >&2
    exit 1
}

# 检查是否为root用户
if [ "$(id -u)" -ne 0 ]; then
    handle_error "此脚本需要root权限运行,请使用sudo执行此脚本"
fi

echo -e "${YELLOW}===== 开始检查已安装的MySQL版本 ====${NC}"

# 查找所有已安装的MySQL相关包
echo -e "${GREEN}正在查找已安装的MySQL包...${NC}"
mysql_packages=$(dpkg -l | grep -i mysql | awk '{print $2}' | tr '\n' ' ')

if [ -z "$mysql_packages" ]; then
    echo -e "${GREEN}未发现已安装的MySQL包${NC}"
else
    echo -e "${GREEN}发现以下MySQL包:${NC}"
    echo "$mysql_packages"
    
    echo -e "${YELLOW}===== 开始卸载MySQL包 ====${NC}"
    echo -e "${GREEN}正在卸载MySQL包...${NC}"
    if ! apt-get purge -y $mysql_packages; then
        handle_error "卸载MySQL包时出错"
    fi
    echo -e "${GREEN}MySQL包卸载完成${NC}"
fi

# 先删除用户再删除用户组(解决主组依赖问题)
echo -e "${YELLOW}===== 检查并清理mysql用户 ====${NC}"
if id -u mysql >/dev/null 2>&1; then
    echo -e "${GREEN}发现mysql用户,正在删除...${NC}"
    # 强制删除用户及其相关文件
    if ! userdel -r mysql; then
        echo -e "${YELLOW}警告: 常规删除mysql用户失败,尝试强制删除...${NC}"
        if ! userdel -f mysql; then
            echo -e "${RED}错误: 无法删除mysql用户,请手动检查${NC}"
        fi
    else
        echo -e "${GREEN}mysql用户已成功删除${NC}"
    fi
else
    echo -e "${GREEN}未发现mysql用户,无需删除${NC}"
fi

# 检查并删除mysql用户组
echo -e "${YELLOW}===== 检查并清理mysql用户组 ====${NC}"
if getent group mysql >/dev/null 2>&1; then
    echo -e "${GREEN}发现mysql用户组,正在删除...${NC}"
    if ! groupdel mysql; then
        echo -e "${YELLOW}警告: 删除mysql用户组失败,可能需要手动清理${NC}"
        echo -e "${YELLOW}建议后续执行: sudo groupdel mysql 再次尝试${NC}"
    else
        echo -e "${GREEN}mysql用户组已成功删除${NC}"
    fi
else
    echo -e "${GREEN}未发现mysql用户组,无需删除${NC}"
fi

# 检查并移除残留配置文件
echo -e "${YELLOW}===== 开始清理残留配置文件 ====${NC}"
echo -e "${GREEN}正在清理MySQL配置文件...${NC}"
mysql_config_dirs="/etc/mysql /var/lib/mysql /var/log/mysql /usr/local/mysql /var/run/mysqld"
for dir in $mysql_config_dirs; do
    if [ -d "$dir" ]; then
        echo -e "${GREEN}移除目录:${NC} $dir"
        # 强制删除目录,处理可能的权限问题
        if ! rm -rf "$dir"; then
            echo -e "${YELLOW}警告: 无法删除目录 $dir,可能被进程占用${NC}"
            echo -e "${YELLOW}建议: 检查进程并手动删除: rm -rf $dir${NC}"
        fi
    fi
done
echo -e "${GREEN}配置文件清理完成${NC}"

# 清理apt缓存
echo -e "${YELLOW}===== 开始清理APT缓存 ====${NC}"
echo -e "${GREEN}正在清理APT缓存...${NC}"
if ! apt-get autoremove -y; then
    handle_error "清理APT缓存时出错"
fi
if ! apt-get autoclean -y; then
    handle_error "清理APT缓存时出错"
fi
echo -e "${GREEN}APT缓存清理完成${NC}"

# 检查是否还有MySQL相关文件(使用兼容sh的语法)
echo -e "${YELLOW}===== 检查是否还有MySQL相关文件 ====${NC}"
echo -e "${GREEN}正在搜索残留的MySQL文件...${NC}"
# 限制搜索深度为5级,避免搜索过慢
remaining_files=$(find / -maxdepth 5 -name "*mysql*" 2>/dev/null | grep -v "^/proc\|^/sys\|^/dev\|^/run" || true)

if [ -n "$remaining_files" ]; then
    echo -e "${YELLOW}发现以下可能的残留文件:${NC}"
    echo "$remaining_files"
    
    echo -e "${YELLOW}是否删除这些文件? (y/n)${NC}"
    read -r answer
    if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
        echo -e "${GREEN}正在删除残留文件...${NC}"
        # 使用管道替代here-string,兼容sh环境
        echo "$remaining_files" | while IFS= read -r file; do
            if [ -e "$file" ]; then
                echo -e "${GREEN}删除文件:${NC} $file"
                if ! rm -rf "$file"; then
                    echo -e "${RED}无法删除文件:${NC} $file"
                fi
            fi
        done
        echo -e "${GREEN}残留文件删除完成${NC}"
    else
        echo -e "${YELLOW}跳过删除残留文件${NC}"
    fi
else
    echo -e "${GREEN}未发现残留的MySQL文件${NC}"
fi

echo -e "${GREEN}===== MySQL卸载流程完成 ====${NC}"
echo -e "${GREEN}提示: 如有残留警告,建议重启系统后手动清理${NC}"    

1.2 下载MySQL安装包并解压

  • 下载MySQL安装包
cd /usr/src
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz
  • 解压MySQL压缩包
xz -d mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-8.0.25-linux-glibc2.12-x86_64.tar
mv mysql-8.0.25-linux-glibc2.12-x86_64 /usr/local/mysql

1.3 用户和目录创建

  • 创建MySQL用户
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# -r建立系统账号
  • 创建MySQL相关目录
mkdir /data/mysql/ -p
mkdir /data/mysql/{binlog,data,log,tmpdir,conf} -p
  • 修改属主
chown -R mysql:mysql /data/mysql/
chown -R mysql:mysql /usr/local/mysql

1.4 增加配置文件

vim /data/mysql/conf/my.cnf

my.cnf内容如下:

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port    = 3306
socket  = /tmp/mysql.sock

##  dir set
datadir           = /data/mysql/data
innodb_data_home_dir   = /data/mysql/data
innodb_log_group_home_dir = /data/mysql/data
log-bin           = /data/mysql/binlog/mysql-bin
log_bin_index             = /data/mysql/binlog/mysql-bin.index  
relay-log         = /data/mysql/binlog/mysql-relay-bin
tmpdir            = /data/mysql/tmpdir
slow_query_log_file   = /data/mysql/log/mysql-slow.log
general_log_file   = /data/mysql/log/mysql-general.log
log-error         = /data/mysql/log/mysql.err

## slave and binlog
server-id = 6666            #   
skip-slave-start = 0        #
read_only = 0           #
binlog_format = row             
log-slave-updates = 1
master_info_repository = table
relay_log_info_repository = table
relay_log_purge = 1
relay_log_recovery = 1
sync_binlog = 100                   # !!!

binlog_cache_size = 1M
expire_logs_days = 30
log_bin_trust_function_creators = 1         
slave_net_timeout=60                
#binlog_error_action="IGNORE_ERROR"     

innodb_autoinc_lock_mode=1          

## 
back_log = 200
bulk_insert_buffer_size = 8M            
#character-set-server = utf8
lower_case_table_names = 1              #  1:不区分

## 基线
local-infile = off
skip-networking = off
skip-name-resolve = on 

## connect
max_allowed_packet = 32M
max_connect_errors = 1000
max_connections = 3000
wait_timeout = 3600             # 关闭 非交互 连接之前等待活动的秒数 default:8h
interactive_timeout = 3600          # 关闭 交互式 连接之前等待活动的秒数 default:8h

table_open_cache = 4096
thread_cache_size =  64
thread_stack = 192K
transaction-isolation = REPEATABLE-READ     # 
pid-file = mysql.pid

## slow
slow_query_log = 1              
long_query_time = 1
log-slow-admin-statements
log_queries_not_using_indexes = 0
slow_launch_time = 1
read_buffer_size = 4M               
read_rnd_buffer_size = 8M           
sort_buffer_size = 8M
join_buffer_size = 32M
tmp_table_size = 128M
max_heap_table_size = 128M

default-storage-engine = innodb
explicit_defaults_for_timestamp = on           

## innodb
innodb_buffer_pool_size = 1G                    
innodb_max_dirty_pages_pct = 80         
innodb_thread_concurrency = 8           
innodb_buffer_pool_instances = 1        
innodb_flush_log_at_trx_commit = 2      
innodb_read_io_threads = 8          
innodb_write_io_threads = 4         
innodb_io_capacity = 1000
innodb_io_capacity_max = 2000
innodb_lru_scan_depth = 1024
innodb_use_native_aio = 1
innodb_flush_neighbors = 1
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1

innodb_data_file_path=ibdata:1G:autoextend
innodb_log_files_in_group = 3
innodb_log_file_size = 2G
innodb_file_per_table = 1 

innodb_flush_method = O_DIRECT
innodb_strict_mode = 1
innodb_lock_wait_timeout = 30
innodb_log_buffer_size = 16M
innodb_adaptive_flushing = 1
innodb_change_buffering = all
innodb_purge_threads = 4            
innodb_purge_batch_size = 300           

innodb_old_blocks_time = 1
innodb_fast_shutdown = 0
performance_schema = 1
innodb_print_all_deadlocks = 1
innodb_sort_buffer_size = 4M 

innodb_page_size = 16k
gtid_mode=on
enforce_gtid_consistency=on     

table_open_cache_instances=16
binlog_rows_query_log_events=1      

slave_parallel_workers = 0          # 多线程复制线程数
#slave_parallel_type=LOGICAL_CLOCK      
#binlog_group_commit_sync_delay = 500000  
#binlog_group_commit_sync_no_delay_count =12  

## pasword
default_password_lifetime=0                     # 0密码永不过期,N n天过期

[mysqldump]
quick
max_allowed_packet = 32M

[mysql]
no-auto-rehash
prompt=p@d>_

[mysqld_safe]
open-files-limit = 28192

[mysqlhotcopy]
interactive-timeout

1.5 初始化并获取临时密码

  • 初始化
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/conf/my.cnf --user=mysql --initialize
  • 获取临时密码
grep "password" /data/mysql/log/mysql.err

在这里插入图片描述

1.6 启动MySQL

  • 配置启动脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/
  • 编辑/etc/init.d/mysql.server,修改这两行:
datadir=/data/mysql/data
confdir=/data/mysql/conf
  • 找到
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &

修改成

$bindir/mysqld_safe --defaults-file=$confdir/my.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
  • 找到
      --datadir=*)  datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`

修改成

      --datadir=*)  datadir="/data/mysql/data/"
  • 重新加载服务配置
systemctl daemon-reload
  • 启动MySQL
/etc/init.d/mysql.server start

1.7 增加环境变量

  • 编辑/etc/profile文件,加入如下内容:
MYSQL_HOME=/usr/local/mysql
PATH=$PATH:$MYSQL_HOME/bin
export PATH MYSQL_HOME
  • 重新加载配置
source /etc/profile

1.8 登录MySQL并修改密码

  • 通过临时密码进入MySQL
mysql -uroot -p'8Vi9KP/-Zi8o'
  • 修改密码
alter user user() identified by "martin";

注意:如果遇到如下报错:mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
解决方案:

  • sudo apt-get update
  • sudo apt-get install libtinfo5

1.9 用新密码登录MySQL

  • 使用修改后的密码登录MySQL,则可以正常使用MySQL了
mysql -uroot -p'martin'

1.10 关闭MySQL

  • 如果需要关闭MySQL,可执行
/etc/init.d/mysql.server stop

2 使用Shell编写自动部署MySQL脚本

2.1 准备

  • 建脚本部署目录
mkdir -p /data/script/install_mysql8
  • 再把一些文件复制过来
cp /data/mysql/conf/my.cnf /data/script/install_mysql8
cp /usr/src/mysql-8.0.25-linux-glibc2.12-x86_64.tar /data/script/install_mysql8
cp /etc/init.d/mysql.server /data/script/install_mysql8
  • 然后把之前安装的MySQL给清空掉
/etc/init.d/mysql.server stop
rm /usr/local/mysql/ -rf
rm /data/mysql -rf
rm /etc/init.d/mysql.server -rf
userdel -r mysql
  • /etc/profile中去掉增加的环境变量
MYSQL_HOME=/usr/local/mysql
PATH=$PATH:$MYSQL_HOME/bin
export PATH MYSQL_HOME
  • 重新加载配置
source /etc/profile

2.2 编辑脚本

# 进入脚本文件夹
cd /data/script/install_mysql8
# 创建并编辑MySQL8安装脚本
vim install_mysql.sh

install_mysql.sh内容如下:

#!/bin/bash

# 解压
if [  -d "/usr/local/mysql" ];then
  echo "/usr/local/mysql文件夹已经存在,请确定是否安装了MySQL"
  exit
fi
echo "正在解压压缩包"
tar xf mysql-8.0.25-linux-glibc2.12-x86_64.tar
mv mysql-8.0.25-linux-glibc2.12-x86_64 /usr/local/mysql
echo "压缩包解压完毕"

# 创建MySQL相关目录
if [ -d "/data/mysql/" ];then
  echo "/data/mysql/文件夹已经存在,请确定是否安装了MySQL"
  exit
fi
mkdir /data/mysql/{binlog,data,log,tmpdir,conf} -p




# 判断是否有MySQL进程
mysql_pid=`ps -ef |grep mysqld |wc -l`


if [ $mysql_pid -eq 1 ];then
     echo "没有MySQL进程在运行"
else
    echo "有MySQL进程在运行,请检查"
    exit
fi

# 创建MySQL用户
mysql_user=`cat /etc/passwd |grep -w mysql|wc -l`

if [ $mysql_user -eq 1 ];then

    echo "MySQL用户已经存在"

else

    echo -e "MySQL用户不存在,开始添加MySQL用户"
    groupadd mysql
    useradd -g mysql mysql
    echo -e "添加MySQL用户成功"

fi

# 修改权限
chown -R mysql:mysql /data/mysql/
chown -R mysql:mysql /usr/local/mysql

# 增加配置文件
cp ./my.cnf /data/mysql/conf/

# 初始化
echo -e "开始初始化"
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/conf/my.cnf --user=mysql --initialize

#判断初始化是否成功
mysql_init=`cat /data/mysql/log/mysql.err |grep -i "root@localhost:"|wc -l`
if [ $mysql_init -eq 1 ];then
  echo "mysql 初始化成功"
else
  echo "mysql 初始化失败"
  exit
fi

# 获取临时密码
temp_pwd=$(grep 'temporary password' /data/mysql/log/mysql.err)
pwd=${temp_pwd##* }
echo "临时密码是:${pwd}"

# 配置启动脚本
if [ ! -f "/etc/init.d/mysql.server" ];then
  cp mysql.server /etc/init.d/ -rf
  chmod 700 /etc/init.d/mysql.server
fi
echo "配置启动脚本完成"

# 启动MySQL
/etc/init.d/mysql.server start
echo "启动MySQL完成"

#增加环境变量
mysql_path=`grep 'export PATH=$PATH:/usr/local/mysql/bin' /etc/profile|wc -l`
if [ $mysql_path -eq 0 ];then
    echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    source /etc/profile
fi
echo "增加环境变量完成"

#通过临时密码登录MySQL,并修改密码
mysql -uroot -p${pwd} --connect-expired-password -e "alter user user() identified by 'martin';"
echo "修改密码完成"

echo "MySQL 8.0.25 安装完成"

2.3 运行脚本

# 赋予执行权限
chmod +x install_mysql.sh
# 执行脚本
./install_mysql.sh

3 将MySQL部署到Docker上

3.1 Docker部署

  • 安装Docker
# 下载curl工具
sudo apt install curl

# 安装方式1
# 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# 安装方式2
# 下载安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
# 执行安装脚本
sudo sh ./get-docker.sh
  • 查看docker版本
docker version

在这里插入图片描述
出现上图,表示docker安装成功。

  • 运行Docker
systemctl start docker

3.2 拉取MySQL镜像

  • 查看可用的MySQL版本
docker search mysql
  • 拉取最新版本的MySQL镜像
docker pull mysql:latest
  • 拉取指定版本8.0.25 MySQL的镜像
docker pull mysql:8.0.25
  • 查看本地镜像
docker images
  • 删除镜像
docker image rm cdf3aa69f5f0

3.3 运行容器

docker run  --name mysql-test -p 3316:3306 -e MYSQL_ROOT_PASSWORD=Martin123 mysql:8.0.25
  • 查看MySQL是否运行
docker ps

3.4 登录MySQL

  • 登录Docker运行的MySQL
mysql -h 127.0.0.1 -P 3316 -uroot -p

3.5 其他操作

  • kill掉MySQL
docker kill 26e553587b34
  • 删除进程
docker rm 26e553587b34
  • 停止容器
docker stop 容器ID|容器名
  • 启动容器
docker start 容器ID|容器名
  • 重启容器
docker restart 容器ID|容器名
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐