上传文件至 mysql
This commit is contained in:
347
mysql/install-mysql8.0.44-docker.sh
Normal file
347
mysql/install-mysql8.0.44-docker.sh
Normal file
@@ -0,0 +1,347 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# MySQL Docker 自动安装脚本
|
||||||
|
# 使用镜像: 根据网络环境自动选择官方或第三方镜像
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# 版权声明
|
||||||
|
# 该脚本由X博客"xblog.tech"编写与维护
|
||||||
|
# 版权所有 (c) 2025 X博客. 保留所有权利.
|
||||||
|
# 未经许可,不得擅自复制、修改或发布本脚本
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
set -e # 遇到错误立即退出
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
PURPLE='\033[0;35m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
NC='\033[0m' # 无颜色
|
||||||
|
|
||||||
|
# 彩色输出函数
|
||||||
|
color_echo() {
|
||||||
|
local color=$1
|
||||||
|
shift
|
||||||
|
echo -e "${color}$*${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查并安装curl(如果需要)
|
||||||
|
check_and_install_curl() {
|
||||||
|
if ! command -v curl &> /dev/null; then
|
||||||
|
color_echo $YELLOW "检测到系统未安装curl,正在尝试安装..."
|
||||||
|
|
||||||
|
# 根据不同的包管理器尝试安装curl
|
||||||
|
if command -v apt-get &> /dev/null; then
|
||||||
|
color_echo $BLUE "使用apt-get安装curl..."
|
||||||
|
sudo apt-get update && sudo apt-get install -y curl
|
||||||
|
elif command -v yum &> /dev/null; then
|
||||||
|
color_echo $BLUE "使用yum安装curl..."
|
||||||
|
sudo yum install -y curl
|
||||||
|
elif command -v dnf &> /dev/null; then
|
||||||
|
color_echo $BLUE "使用dnf安装curl..."
|
||||||
|
sudo dnf install -y curl
|
||||||
|
elif command -v apk &> /dev/null; then
|
||||||
|
color_echo $BLUE "使用apk安装curl..."
|
||||||
|
sudo apk add curl
|
||||||
|
else
|
||||||
|
color_echo $RED "无法自动安装curl,请手动安装后再运行此脚本"
|
||||||
|
color_echo $YELLOW "您可以运行以下命令之一来安装curl:"
|
||||||
|
color_echo $CYAN " Ubuntu/Debian: sudo apt-get install curl"
|
||||||
|
color_echo $CYAN " CentOS/RHEL: sudo yum install curl"
|
||||||
|
color_echo $CYAN " Fedora: sudo dnf install curl"
|
||||||
|
color_echo $CYAN " Alpine: sudo apk add curl"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 验证安装是否成功
|
||||||
|
if command -v curl &> /dev/null; then
|
||||||
|
color_echo $GREEN "✓ curl安装成功"
|
||||||
|
else
|
||||||
|
color_echo $RED "✗ curl安装失败,请手动安装后再运行此脚本"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
color_echo $GREEN "✓ 系统已安装curl"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
color_echo $PURPLE "=== MySQL 8.0.44 Docker 自动安装脚本 ==="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查Docker是否安装
|
||||||
|
if ! command -v docker &> /dev/null; then
|
||||||
|
color_echo $RED "错误: Docker 未安装,请先安装Docker"
|
||||||
|
color_echo $YELLOW "安装Docker的参考命令:"
|
||||||
|
color_echo $CYAN " curl -fsSL https://get.docker.com -o get-docker.sh"
|
||||||
|
color_echo $CYAN " sudo sh get-docker.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
color_echo $GREEN "✓ Docker 已安装"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查并确保curl已安装
|
||||||
|
check_and_install_curl
|
||||||
|
|
||||||
|
# 网络环境检测和镜像选择
|
||||||
|
color_echo $BLUE "检测网络环境..."
|
||||||
|
OFFICIAL_IMAGE="library/mysql:8.0.44"
|
||||||
|
THIRD_PARTY_IMAGE="docker.1ms.run/library/mysql:8.0.44"
|
||||||
|
|
||||||
|
# 检测是否能够访问Docker Hub
|
||||||
|
check_network() {
|
||||||
|
color_echo $BLUE "正在测试网络连接..."
|
||||||
|
|
||||||
|
# 尝试访问Docker Hub
|
||||||
|
if curl --connect-timeout 10 -s https://hub.docker.com/ > /dev/null; then
|
||||||
|
color_echo $GREEN "✓ 可以访问 Docker Hub"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
color_echo $YELLOW "✗ 无法访问 Docker Hub"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 选择镜像源
|
||||||
|
select_image_source() {
|
||||||
|
if check_network; then
|
||||||
|
MYSQL_IMAGE=$OFFICIAL_IMAGE
|
||||||
|
color_echo $GREEN "将使用官方镜像: $MYSQL_IMAGE"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
color_echo $YELLOW "⚠️ ⚠️ ⚠️ 安全提示 ⚠️ ⚠️ ⚠️"
|
||||||
|
color_echo $RED "您即将调用第三方镜像源进行容器的创建,在此之前请您确认您信任该镜像的来源"
|
||||||
|
color_echo $YELLOW "镜像来源: \"毫秒镜像 1ms.run/r/library/mysql\""
|
||||||
|
echo ""
|
||||||
|
color_echo $CYAN "若您同意使用该镜像请您输入 y 确认: "
|
||||||
|
read -p "确认使用第三方镜像 (y/N): " CONFIRM_THIRD_PARTY
|
||||||
|
|
||||||
|
if [[ $CONFIRM_THIRD_PARTY =~ ^[Yy]$ ]]; then
|
||||||
|
MYSQL_IMAGE=$THIRD_PARTY_IMAGE
|
||||||
|
color_echo $GREEN "将使用第三方镜像: $MYSQL_IMAGE"
|
||||||
|
else
|
||||||
|
color_echo $YELLOW "安装已取消"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# 执行镜像源选择
|
||||||
|
select_image_source
|
||||||
|
|
||||||
|
# 交互式获取用户输入
|
||||||
|
color_echo $PURPLE "请配置MySQL安装参数(可直接回车使用默认值)"
|
||||||
|
color_echo $CYAN "=========================================="
|
||||||
|
|
||||||
|
# 容器名称
|
||||||
|
read -p "$(color_echo $BLUE '1. 输入容器名称') [$(color_echo $GREEN '默认: mysql-8.0.44')]: " CONTAINER_NAME
|
||||||
|
CONTAINER_NAME=${CONTAINER_NAME:-"mysql-8.0.44"}
|
||||||
|
|
||||||
|
# MySQL root密码
|
||||||
|
while true; do
|
||||||
|
read -s -p "$(color_echo $BLUE '2. 输入MySQL root密码 (输入将隐藏)') : " MYSQL_ROOT_PASSWORD
|
||||||
|
echo
|
||||||
|
if [ -z "$MYSQL_ROOT_PASSWORD" ]; then
|
||||||
|
color_echo $RED "错误: Root密码不能为空,请重新输入"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -s -p "$(color_echo $BLUE '请再次确认root密码') : " MYSQL_ROOT_PASSWORD_CONFIRM
|
||||||
|
echo
|
||||||
|
if [ "$MYSQL_ROOT_PASSWORD" != "$MYSQL_ROOT_PASSWORD_CONFIRM" ]; then
|
||||||
|
color_echo $RED "错误: 两次输入的密码不一致,请重新输入"
|
||||||
|
else
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 端口号
|
||||||
|
read -p "$(color_echo $BLUE '3. 输入MySQL映射端口') [$(color_echo $GREEN '默认: 3306')]: " MYSQL_PORT
|
||||||
|
MYSQL_PORT=${MYSQL_PORT:-"3306"}
|
||||||
|
|
||||||
|
# 检查端口是否被占用
|
||||||
|
if command -v lsof &> /dev/null; then
|
||||||
|
if lsof -Pi :$MYSQL_PORT -sTCP:LISTEN -t >/dev/null ; then
|
||||||
|
color_echo $YELLOW "警告: 端口 $MYSQL_PORT 已被占用,请选择其他端口"
|
||||||
|
read -p "$(color_echo $BLUE '输入新的MySQL映射端口'): " MYSQL_PORT
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
color_echo $YELLOW "注意: 无法检查端口占用情况(lsof未安装),请确保端口 $MYSQL_PORT 可用"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 数据目录
|
||||||
|
read -p "$(color_echo $BLUE '4. 输入数据存储目录') [$(color_echo $GREEN '默认: /docker/mysql/data')]: " DATA_DIR
|
||||||
|
DATA_DIR=${DATA_DIR:-"/docker/mysql/data"}
|
||||||
|
|
||||||
|
# 配置目录
|
||||||
|
read -p "$(color_echo $BLUE '5. 输入配置存储目录') [$(color_echo $GREEN '默认: /docker/mysql/conf')]: " CONF_DIR
|
||||||
|
CONF_DIR=${CONF_DIR:-"/docker/mysql/conf"}
|
||||||
|
|
||||||
|
# 显示配置摘要
|
||||||
|
echo ""
|
||||||
|
color_echo $PURPLE "=== 安装配置摘要 ==="
|
||||||
|
color_echo $CYAN "容器名称: $CONTAINER_NAME"
|
||||||
|
color_echo $CYAN "MySQL 端口: $MYSQL_PORT"
|
||||||
|
color_echo $CYAN "数据目录: $DATA_DIR"
|
||||||
|
color_echo $CYAN "配置目录: $CONF_DIR"
|
||||||
|
color_echo $CYAN "使用镜像: $MYSQL_IMAGE"
|
||||||
|
color_echo $CYAN "Root密码: ******"
|
||||||
|
echo ""
|
||||||
|
color_echo $YELLOW "注意: 此安装只创建root用户,不创建额外数据库和用户"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 确认安装
|
||||||
|
read -p "$(color_echo $BLUE '是否继续安装?(y/n)') [$(color_echo $GREEN '默认: y')]: " CONFIRM_INSTALL
|
||||||
|
CONFIRM_INSTALL=${CONFIRM_INSTALL:-"y"}
|
||||||
|
|
||||||
|
if [[ ! $CONFIRM_INSTALL =~ ^[Yy]$ ]]; then
|
||||||
|
color_echo $YELLOW "安装已取消"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
color_echo $GREEN "开始安装 MySQL 8.0.44..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 创建数据目录和配置目录
|
||||||
|
color_echo $BLUE "创建数据目录..."
|
||||||
|
sudo mkdir -p $DATA_DIR
|
||||||
|
sudo mkdir -p $CONF_DIR
|
||||||
|
sudo chmod -R 755 $DATA_DIR
|
||||||
|
sudo chmod -R 755 $CONF_DIR
|
||||||
|
|
||||||
|
color_echo $GREEN "✓ 目录创建完成: $DATA_DIR, $CONF_DIR"
|
||||||
|
|
||||||
|
# 拉取MySQL镜像
|
||||||
|
color_echo $BLUE "拉取 MySQL 镜像: $MYSQL_IMAGE"
|
||||||
|
docker pull $MYSQL_IMAGE
|
||||||
|
|
||||||
|
color_echo $GREEN "✓ MySQL 镜像拉取完成"
|
||||||
|
|
||||||
|
# 创建自定义配置文件
|
||||||
|
color_echo $BLUE "创建MySQL配置文件..."
|
||||||
|
sudo tee $CONF_DIR/my.cnf > /dev/null << EOF
|
||||||
|
[mysqld]
|
||||||
|
default_authentication_plugin=mysql_native_password
|
||||||
|
character-set-server=utf8mb4
|
||||||
|
collation-server=utf8mb4_unicode_ci
|
||||||
|
max_connections=1000
|
||||||
|
innodb_buffer_pool_size=256M
|
||||||
|
|
||||||
|
[client]
|
||||||
|
default-character-set=utf8mb4
|
||||||
|
|
||||||
|
[mysql]
|
||||||
|
default-character-set=utf8mb4
|
||||||
|
EOF
|
||||||
|
|
||||||
|
color_echo $GREEN "✓ 配置文件创建完成"
|
||||||
|
|
||||||
|
# 停止并删除已存在的同名容器(如果存在)
|
||||||
|
if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then
|
||||||
|
color_echo $YELLOW "发现已存在的容器,停止并删除..."
|
||||||
|
docker stop $CONTAINER_NAME
|
||||||
|
docker rm $CONTAINER_NAME
|
||||||
|
color_echo $GREEN "✓ 旧容器已清理"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 运行MySQL容器(只设置root密码)
|
||||||
|
color_echo $BLUE "启动 MySQL 容器..."
|
||||||
|
docker run -d \
|
||||||
|
--name $CONTAINER_NAME \
|
||||||
|
--restart=unless-stopped \
|
||||||
|
-p $MYSQL_PORT:3306 \
|
||||||
|
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
|
||||||
|
-v $DATA_DIR:/var/lib/mysql \
|
||||||
|
-v $CONF_DIR:/etc/mysql/conf.d \
|
||||||
|
$MYSQL_IMAGE
|
||||||
|
|
||||||
|
color_echo $GREEN "✓ MySQL 容器启动完成"
|
||||||
|
|
||||||
|
# 等待MySQL启动
|
||||||
|
color_echo $BLUE "等待MySQL服务启动..."
|
||||||
|
for i in {1..30}; do
|
||||||
|
if docker logs $CONTAINER_NAME 2>&1 | grep -q "Ready for start up"; then
|
||||||
|
color_echo $GREEN "✓ MySQL 启动完成"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
color_echo $YELLOW "等待MySQL启动... ($i/30)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# 检查容器状态
|
||||||
|
if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then
|
||||||
|
color_echo $GREEN "✓ MySQL 容器正在运行"
|
||||||
|
|
||||||
|
# 测试连接
|
||||||
|
color_echo $BLUE "测试MySQL连接..."
|
||||||
|
sleep 5
|
||||||
|
if docker exec $CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SELECT 1;" &> /dev/null; then
|
||||||
|
color_echo $GREEN "✓ MySQL 连接测试成功"
|
||||||
|
|
||||||
|
# 显示默认数据库
|
||||||
|
color_echo $BLUE "默认数据库列表:"
|
||||||
|
docker exec $CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW DATABASES;"
|
||||||
|
else
|
||||||
|
color_echo $YELLOW "⚠️ MySQL 连接测试失败,请检查日志"
|
||||||
|
docker logs $CONTAINER_NAME
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
color_echo $RED "❌ MySQL 容器启动失败"
|
||||||
|
docker logs $CONTAINER_NAME
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 显示安装完成信息
|
||||||
|
echo ""
|
||||||
|
color_echo $PURPLE "=== MySQL 安装完成 ==="
|
||||||
|
color_echo $GREEN "容器名称: $CONTAINER_NAME"
|
||||||
|
color_echo $GREEN "MySQL 版本: 8.0.44"
|
||||||
|
color_echo $GREEN "连接地址: 127.0.0.1:$MYSQL_PORT"
|
||||||
|
color_echo $GREEN "数据目录: $DATA_DIR"
|
||||||
|
color_echo $GREEN "配置目录: $CONF_DIR"
|
||||||
|
color_echo $GREEN "使用镜像: $MYSQL_IMAGE"
|
||||||
|
color_echo $GREEN "Root 用户: root"
|
||||||
|
echo ""
|
||||||
|
color_echo $CYAN "管理命令:"
|
||||||
|
color_echo $BLUE "查看日志: docker logs $CONTAINER_NAME"
|
||||||
|
color_echo $BLUE "进入容器: docker exec -it $CONTAINER_NAME bash"
|
||||||
|
color_echo $BLUE "连接MySQL: docker exec -it $CONTAINER_NAME mysql -uroot -p"
|
||||||
|
color_echo $BLUE "停止容器: docker stop $CONTAINER_NAME"
|
||||||
|
color_echo $BLUE "启动容器: docker start $CONTAINER_NAME"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 保存配置信息到文件(可选)
|
||||||
|
CONFIG_FILE="./mysql_install_${CONTAINER_NAME}.info"
|
||||||
|
cat > $CONFIG_FILE << EOF
|
||||||
|
MySQL 安装配置信息
|
||||||
|
安装时间: $(date)
|
||||||
|
容器名称: $CONTAINER_NAME
|
||||||
|
MySQL 版本: 8.0.44
|
||||||
|
连接端口: $MYSQL_PORT
|
||||||
|
数据目录: $DATA_DIR
|
||||||
|
配置目录: $CONF_DIR
|
||||||
|
使用镜像: $MYSQL_IMAGE
|
||||||
|
Root 密码: $MYSQL_ROOT_PASSWORD
|
||||||
|
EOF
|
||||||
|
|
||||||
|
color_echo $GREEN "配置信息已保存到: $CONFIG_FILE"
|
||||||
|
color_echo $YELLOW "请注意妥善保管此文件,特别是密码信息!"
|
||||||
|
echo ""
|
||||||
|
color_echo $CYAN "安装后建议操作:"
|
||||||
|
color_echo $BLUE "1. 登录MySQL后创建所需的数据库和用户"
|
||||||
|
color_echo $BLUE "2. 根据需求调整MySQL配置"
|
||||||
|
color_echo $BLUE "3. 考虑设置定期备份策略"
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# 版权声明
|
||||||
|
# 该脚本由X博客"xblog.tech"编写与维护
|
||||||
|
# 版权所有 (c) 2025 X博客. 保留所有权利.
|
||||||
|
# 未经许可,不得擅自复制、修改或发布本脚本
|
||||||
|
###############################################################################
|
||||||
Reference in New Issue
Block a user