Docker容器中MySQL安装、配置

一、docker下载MySQL镜像

docker pull mysql  默认下载最新版本
docker pull mysql:{版本号}
例:docker pull mysql:5.7

查看MySQL镜像是否下载成功

docker images

二、创建mysql目录

1、创建mysql配置文件目录,使用 -p 创建多级目录

mkdir -p /docker/mysql/conf

2、编写配置文件

cd /docker/mysql/conf

vi my.conf
[client]
# 端口号
port=3306

[mysql]
no-beep
# 配置了 MySQL 客户端的默认字符集
default-character-set=utf8mb4
 
[mysqld]
# 端口号
port=3306
# 数据目录
datadir=/var/lib/mysql
# 设置了 MySQL 服务器的字符集为 UTF-8
character-set-server=utf8mb4
# 设置了 MySQL 服务器的排序规则为 utf8mb4_unicode_ci,通常用于支持国际化和多语言字符的正确排序
collation-server=utf8mb4_unicode_ci
# 用于禁用客户端字符集握手,允许客户端和服务器之间的字符集设置更加灵活
skip-character-set-client-handshake
# 禁用了主机名解析,以提高连接性能
skip-name-resolve
# 默认存储引擎
default-storage-engine=INNODB
# 将 SQL 模式设置为严格
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
#  最大连接数
max_connections=1024
# 表缓存
table_open_cache=2000
# 表内存
tmp_table_size=16M
# 线程缓存
thread_cache_size=10
# 设置大小写不敏感
lower_case_table_names=1
 
# myisam设置
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=8M
key_buffer_size=8M
read_buffer_size=0
read_rnd_buffer_size=0
 
# innodb设置
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_log_file_size=48M
innodb_thread_concurrency=33
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
# 其他设置
back_log=80
flush_time=0
join_buffer_size=256K
max_allowed_packet=4M
max_connect_errors=100
open_files_limit=4161
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
sync_master_info=10000
sync_relay_log=10000
sync_relay_log_info=10000

 三、启动MySQL

1、编写脚本 

cd /docker/mysql/
 
vi startMysql.sh
docker run \
--name mysql \
-d \
-p 3306:3306 \
--restart=always \
-v /docker/mysql/log:/var/log/mysql \
-v /docker/mysql/data:/var/lib/mysql \
-v /docker/mysql/conf:/etc/mysql/conf.d \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7

参数说明:

docker run:这是 Docker 启动容器的命令。

-d:这个选项使容器在后台运行,以允许您继续在终端中执行其他命令。

--name mysql:创建的容器名称

-p 3306:3306:这部分命令将主机的端口 3306 映射到容器内的 3306 端口。

--restart=always :开机自动启动

-v /docker/mysql/log:/var/log/mysql:映射日志目录,宿主机:容器。

-v /docker/mysql/data:/var/lib/mysql:映射数据目录,宿主机:容器

-v /docker/mysql/conf:/etc/mysql/conf.d:映射配置目录,宿主机:容器。

 -v /etc/localtime:/etc/localtime:ro \ : 让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读。

-e MYSQL_ROOT_PASSWORD=root:这个选项设置 MySQL 根用户的密码。

mysql:5.7:这是要运行的 Docker 镜像的名称和标签。

2、赋予权限 

chmod -R 777 startMysql.sh

3、启动脚本

./startMysql.sh

4、查看运行镜像

docker ps

5、查看日志 

docker logs mysql

6、测试连接 

 四、设置开机自动启动/取消开机启动

docker ps

 1、设置开机自启动

docker update --restart=always 容器ID 

2、取消开机自动启动

docker update --restart=no 容器ID 

 五、定时备份数据

1、备份方式

每周全量备份:备份整个数据库内容,通常选择周日。

每天增量备份:仅备份每天新增或修改的数据,相较全量备份节省存储空间和时间

 2、创建备份目录

# 全量备份文件夹
mkdir -p /docker/mysql/backup/full
# 增量备份文件夹
mkdir -p /docker/mysql/backup/incremental

 3、编写备份脚本

在/docker/mysql/backup编辑

vi mysql_backup.sh

 编辑内容:

#!/bin/bash
 
 
# 配置部分
CONTAINER_NAME="mysql"                             # 你自己的MySQL容器名称
BACKUP_DIR="/docker/mysql/backup"                  # 备份存储根目录
FULL_BACKUP_DIR="$BACKUP_DIR/full"                 # 全量备份文件夹
INCREMENTAL_BACKUP_DIR="$BACKUP_DIR/incremental"   # 增量备份文件夹
DATE=$(date +"%Y%m%d")
 
 
# 保留的备份数量
MAX_BACKUPS=10
 
 
# 每周日进行全量备份
if [[ $(date +%u) -eq 7 ]]; then
    echo "开始全量备份..."
    BACKUP_FILE="$FULL_BACKUP_DIR/mysql_full_$DATE.sql"
    docker exec $CONTAINER_NAME sh -c "mysqldump --all-databases -uroot -p你自己的的数据库密码" > "$BACKUP_FILE"
    gzip "$BACKUP_FILE"  # 压缩备份文件
    echo "全量备份完成并压缩,存储路径:$BACKUP_FILE.gz"
else
    # 每天增量备份
    echo "开始增量备份..."
    BACKUP_FILE="$INCREMENTAL_BACKUP_DIR/mysql_inc_$DATE.sql"
    docker exec $CONTAINER_NAME sh -c "mysqlbinlog --read-from-remote-server --host=localhost --user=root --password=你自己的的数据库密码 --raw mysql-bin.*" > "$BACKUP_FILE"
    gzip "$BACKUP_FILE"  # 压缩备份文件
    echo "增量备份完成并压缩,存储路径:$BACKUP_FILE.gz"
fi
 
 
# 清理多余备份,保留最近的10个备份
cleanup_backups() {
    local BACKUP_FOLDER=$1
    local BACKUP_FILES_COUNT=$(ls -1 "$BACKUP_FOLDER" | wc -l)
 
 
    if (( BACKUP_FILES_COUNT > MAX_BACKUPS )); then
        local FILES_TO_DELETE=$((BACKUP_FILES_COUNT - MAX_BACKUPS))
        echo "超过 $MAX_BACKUPS 份备份,开始删除旧备份..."
        ls -1tr "$BACKUP_FOLDER" | head -n $FILES_TO_DELETE | while read -r FILE; do
            rm -f "$BACKUP_FOLDER/$FILE"
            echo "已删除过期备份:$BACKUP_FOLDER/$FILE"
        done
    fi
}
 
 
# 执行清理操作
cleanup_backups "$FULL_BACKUP_DIR"
cleanup_backups "$INCREMENTAL_BACKUP_DIR"

 赋予脚本执行权限

chmod +x /docker/mysql/backup/mysql_backup.sh

4、设置定时任务

编辑 crontab

crontab -e

 配置定时任务:每晚凌晨两点执行

0 2 * * * /backup/mysql/mysql_backup.sh >> /backup/mysql/backup.log 2>&1

 5、验证脚本是否有效

手动执行脚本查看是否备份

/docker/mysql/backup/mysql_backup.sh

 查看备份日志

tail -f /docker/mysql/backup/backup.log

6、恢复数据

1、先将最新备份的全量文件导入数据库

2、再将增量备份文件逐个执行

 六、修改密码

1、进入容器

docker exec -it mysql bash

 登录MySQL

mysql -u root -proot

2、修改密码 

# 修改普通用户,只改一个就好 
SET PASSWORD FOR 'youruser' = PASSWORD('xxxxxxxx'); 
# 修改root用户,改两个 
SET PASSWORD FOR 'root' = PASSWORD('xxxxxxxxx'); 
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('xxxxxxxxx');

 退出MySQL服务

\q

退出容器

exit

3、重启服务/容器

docker restart mysql

七、添加配置

1、修改容器中的MySQL时间不同步的问题
2、修改容器中的MySQL分组only_full_group_by问题
3、修改表名不区分大小写问题

在MySQL配置文件(通常是my.cnf)中,确保已正确配置时区。您可以在配置文件中添加以下内容:

[mysqld]
default_time_zone = '+8:00'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1

default_time_zone = '+8:00':设置数据库的默认时区为 UTC+8。这意味着在执行与日期和时间相关的操作时,数据库将根据这个时区进行转换。

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION:设置 SQL 模式,以便更严格地遵循 SQL 标准。这有助于避免潜在的数据问题和错误。具体来说,这些模式包括:

STRICT_TRANS_TABLES:禁止在严格模式下插入无效日期和数据。

NO_ZERO_IN_DATE:禁止使用零日期(如 '0000-00-00')。

NO_ZERO_DATE:禁止使用零日期(如 '0000-00-00')。

ERROR_FOR_DIVISION_BY_ZERO:将除以零的操作视为错误,而不是警告。

NO_AUTO_CREATE_USER:禁止自动创建用户。

NO_ENGINE_SUBSTITUTION:如果请求的存储引擎不可用,禁止自动使用替代存储引擎。

lower_case_table_names = 1:将所有表名存储为小写。这有助于避免因大小写不同而导致的表名混淆和错误。在某些操作系统(如 Windows 和 macOS)上,这个选项可能对大小写不敏感,而在其他操作系统(如 Linux)上可能对大小写敏感。设置为 1 表示启用该功能,0 表示禁用。

 重启服务/容器

docker restart mysql

### 如何在Ubuntu上安装NVIDIA显卡驱动 #### 准备工作 为了确保顺利安装,在开始之前建议更新系统的软件包列表并重启计算机以应用所有可用的更新。可以通过运行`sudo apt update && sudo apt upgrade`来完成此操作[^1]。 #### 添加图形化界面黑lists 有时默认的开源 Nouveau 驱动会与 NVIDIA 的专有驱动冲突,因此需要禁用它。创建一个新的文件 `/etc/modprobe.d/blacklist-nouveau.conf` 并加入两行配置: ```bash blacklist nouveau options nouveau modeset=0 ``` 之后执行命令 `sudo update-initramfs -u` 来使更改生效。 #### 下载合适的驱动版本 前往[NVIDIA官方网站](https://www.nvidia.com/Download/index.aspx),根据自己的 GPU 型号下载对应的 Linux 版本驱动程序。也可以通过终端使用如下命令自动检测并安装推荐的驱动: ```bash ubuntu-drivers devices sudo ubuntu-drivers autoinstall ``` 对于某些特定情况下的用户来说,可能更倾向于手动指定要安装的具体版本号,这时可利用 `apt search nvidia-driver` 查找所需版本再进行安装[^2]。 #### 执行安装过程 当选择了适合的方式获取到驱动后,就可以按照下面方式继续: 如果是从官网下载.run 文件,则需先切换至TTY模式(Ctrl+Alt+F1~F6),注销当前登录 session 或者停止 X server (`sudo service lightdm stop`) ,然后给予 .run 文件权限(`chmod +x NVIDIA-Linux-x86_64*.run`) 并执行该脚本(`sudo ./NVIDIA-Linux-x86_64*.run`). 而如果采用的是APT仓库中的.deb 包形式分发的话,只需简单地输入 `sudo dpkg -i *.deb` 即可完成部署;当然最简便的方法还是依赖于上述提到过的 `autoinstall` 功能. #### 完成设置 一旦安装完毕,请记得重新启动电脑让新的驱动生效。开机进入系统后可通过 `nvidia-smi` 或者 `lspci | grep VGA` 检查是否正确加载了新安装的 NVIDIA 显卡驱动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值