2.1 MySQL安装概述

MySQL支持多种安装方式,包括二进制包安装、源码编译安装、Docker容器安装等。本章将详细介绍在不同操作系统上安装和配置MySQL的方法。

2.1.1 安装方式对比

class MySQLInstallationMethods:
    def __init__(self):
        self.methods = {
            "二进制包安装": {
                "优点": ["安装简单", "配置方便", "官方支持"],
                "缺点": ["定制性较差", "版本更新依赖包管理器"],
                "适用场景": "生产环境、快速部署"
            },
            "源码编译安装": {
                "优点": ["高度定制", "性能优化", "版本控制灵活"],
                "缺点": ["编译时间长", "依赖管理复杂", "技术要求高"],
                "适用场景": "特殊需求、性能调优"
            },
            "Docker容器安装": {
                "优点": ["环境隔离", "快速部署", "版本管理方便"],
                "缺点": ["资源开销", "网络配置复杂"],
                "适用场景": "开发测试、微服务架构"
            },
            "云服务安装": {
                "优点": ["免运维", "高可用", "弹性扩展"],
                "缺点": ["成本较高", "定制受限"],
                "适用场景": "企业应用、快速上线"
            }
        }
    
    def compare_methods(self):
        """对比安装方式"""
        print("MySQL安装方式对比:")
        print("=" * 60)
        
        for method, details in self.methods.items():
            print(f"\n{method}:")
            print(f"  优点: {', '.join(details['优点'])}")
            print(f"  缺点: {', '.join(details['缺点'])}")
            print(f"  适用场景: {details['适用场景']}")
    
    def recommend_method(self, scenario):
        """根据场景推荐安装方式"""
        recommendations = {
            "生产环境": "二进制包安装 - 稳定可靠,官方支持",
            "开发测试": "Docker容器安装 - 快速部署,环境隔离",
            "性能调优": "源码编译安装 - 高度定制,性能优化",
            "企业应用": "云服务安装 - 免运维,高可用性"
        }
        return recommendations.get(scenario, "请提供具体使用场景")

# 安装方式对比
install_methods = MySQLInstallationMethods()
install_methods.compare_methods()

print("\n场景推荐:")
scenarios = ["生产环境", "开发测试", "性能调优", "企业应用"]
for scenario in scenarios:
    recommendation = install_methods.recommend_method(scenario)
    print(f"{scenario}: {recommendation}")

2.2 Linux系统安装

2.2.1 CentOS/RHEL安装

class CentOSMySQLInstaller:
    def __init__(self):
        self.version = "8.0"
        self.repo_url = "https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm"
        self.service_name = "mysqld"
    
    def install_steps(self):
        """CentOS安装步骤"""
        steps = [
            {
                "step": 1,
                "description": "添加MySQL官方仓库",
                "commands": [
                    "sudo yum install -y wget",
                    f"wget {self.repo_url}",
                    "sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm"
                ]
            },
            {
                "step": 2,
                "description": "安装MySQL服务器",
                "commands": [
                    "sudo yum update -y",
                    "sudo yum install -y mysql-community-server"
                ]
            },
            {
                "step": 3,
                "description": "启动MySQL服务",
                "commands": [
                    f"sudo systemctl start {self.service_name}",
                    f"sudo systemctl enable {self.service_name}",
                    f"sudo systemctl status {self.service_name}"
                ]
            },
            {
                "step": 4,
                "description": "获取临时密码",
                "commands": [
                    "sudo grep 'temporary password' /var/log/mysqld.log"
                ]
            },
            {
                "step": 5,
                "description": "安全初始化",
                "commands": [
                    "sudo mysql_secure_installation"
                ]
            }
        ]
        
        print("CentOS MySQL安装步骤:")
        print("=" * 50)
        
        for step in steps:
            print(f"\n步骤 {step['step']}: {step['description']}")
            for cmd in step['commands']:
                print(f"  $ {cmd}")
    
    def post_installation_config(self):
        """安装后配置"""
        print("\n安装后配置:")
        print("=" * 30)
        
        configs = {
            "防火墙配置": [
                "sudo firewall-cmd --permanent --add-port=3306/tcp",
                "sudo firewall-cmd --reload"
            ],
            "创建用户": [
                "mysql -u root -p",
                "CREATE USER 'admin'@'%' IDENTIFIED BY 'StrongPassword123!';",
                "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';",
                "FLUSH PRIVILEGES;"
            ],
            "配置文件优化": [
                "sudo vim /etc/my.cnf",
                "# 添加配置项",
                "[mysqld]",
                "max_connections=1000",
                "innodb_buffer_pool_size=1G"
            ]
        }
        
        for config_type, commands in configs.items():
            print(f"\n{config_type}:")
            for cmd in commands:
                print(f"  {cmd}")

# CentOS安装演示
centos_installer = CentOSMySQLInstaller()
centos_installer.install_steps()
centos_installer.post_installation_config()

2.2.2 Ubuntu/Debian安装

class UbuntuMySQLInstaller:
    def __init__(self):
        self.version = "8.0"
        self.package_name = "mysql-server"
        self.service_name = "mysql"
    
    def install_steps(self):
        """Ubuntu安装步骤"""
        steps = [
            {
                "step": 1,
                "description": "更新包索引",
                "commands": [
                    "sudo apt update",
                    "sudo apt upgrade -y"
                ]
            },
            {
                "step": 2,
                "description": "安装MySQL服务器",
                "commands": [
                    f"sudo apt install -y {self.package_name}"
                ]
            },
            {
                "step": 3,
                "description": "检查服务状态",
                "commands": [
                    f"sudo systemctl status {self.service_name}",
                    f"sudo systemctl enable {self.service_name}"
                ]
            },
            {
                "step": 4,
                "description": "安全初始化",
                "commands": [
                    "sudo mysql_secure_installation"
                ]
            }
        ]
        
        print("Ubuntu MySQL安装步骤:")
        print("=" * 50)
        
        for step in steps:
            print(f"\n步骤 {step['step']}: {step['description']}")
            for cmd in step['commands']:
                print(f"  $ {cmd}")
    
    def authentication_setup(self):
        """认证设置"""
        print("\nUbuntu MySQL认证设置:")
        print("=" * 40)
        
        auth_steps = [
            "# 登录MySQL(Ubuntu默认使用auth_socket插件)",
            "sudo mysql",
            "",
            "# 修改root用户认证方式",
            "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPassword123!';",
            "",
            "# 刷新权限",
            "FLUSH PRIVILEGES;",
            "",
            "# 退出并重新登录测试",
            "EXIT;",
            "mysql -u root -p"
        ]
        
        for step in auth_steps:
            print(step)

# Ubuntu安装演示
ubuntu_installer = UbuntuMySQLInstaller()
ubuntu_installer.install_steps()
ubuntu_installer.authentication_setup()

2.3 Windows系统安装

2.3.1 Windows安装器安装

class WindowsMySQLInstaller:
    def __init__(self):
        self.installer_url = "https://dev.mysql.com/downloads/installer/"
        self.version = "8.0"
        self.default_port = 3306
    
    def installation_guide(self):
        """Windows安装指南"""
        print("Windows MySQL安装指南:")
        print("=" * 50)
        
        steps = [
            {
                "step": 1,
                "title": "下载安装器",
                "details": [
                    f"访问官网: {self.installer_url}",
                    "选择 MySQL Installer for Windows",
                    "下载 mysql-installer-community-8.0.x.x.msi"
                ]
            },
            {
                "step": 2,
                "title": "运行安装器",
                "details": [
                    "右键以管理员身份运行安装器",
                    "选择安装类型: Developer Default 或 Server only",
                    "检查系统要求"
                ]
            },
            {
                "step": 3,
                "title": "配置MySQL服务器",
                "details": [
                    "配置类型: Development Computer",
                    f"端口号: {self.default_port}",
                    "认证方法: Use Strong Password Encryption"
                ]
            },
            {
                "step": 4,
                "title": "设置root密码",
                "details": [
                    "设置强密码(至少8位,包含大小写字母、数字、特殊字符)",
                    "可选择添加其他用户账户"
                ]
            },
            {
                "step": 5,
                "title": "配置Windows服务",
                "details": [
                    "服务名: MySQL80",
                    "启动类型: Automatic",
                    "运行账户: Network Service"
                ]
            }
        ]
        
        for step in steps:
            print(f"\n步骤 {step['step']}: {step['title']}")
            for detail in step['details']:
                print(f"  - {detail}")
    
    def post_installation_tasks(self):
        """安装后任务"""
        print("\n安装后任务:")
        print("=" * 30)
        
        tasks = {
            "环境变量配置": [
                "添加 C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin 到 PATH",
                "重启命令提示符或PowerShell"
            ],
            "防火墙配置": [
                "Windows Defender防火墙 -> 高级设置",
                "入站规则 -> 新建规则 -> 端口 -> TCP -> 3306",
                "允许连接"
            ],
            "服务管理": [
                "services.msc 打开服务管理器",
                "找到 MySQL80 服务",
                "设置启动类型为自动"
            ],
            "连接测试": [
                "打开命令提示符",
                "mysql -u root -p",
                "输入密码连接"
            ]
        }
        
        for task_type, steps in tasks.items():
            print(f"\n{task_type}:")
            for step in steps:
                print(f"  - {step}")

# Windows安装演示
windows_installer = WindowsMySQLInstaller()
windows_installer.installation_guide()
windows_installer.post_installation_tasks()

2.3.2 ZIP包安装

class WindowsZipInstaller:
    def __init__(self):
        self.zip_url = "https://dev.mysql.com/downloads/mysql/"
        self.install_path = "C:\\mysql"
        self.data_path = "C:\\mysql\\data"
    
    def zip_installation_steps(self):
        """ZIP包安装步骤"""
        print("Windows ZIP包安装步骤:")
        print("=" * 50)
        
        steps = [
            {
                "step": 1,
                "description": "下载ZIP包",
                "actions": [
                    f"访问 {self.zip_url}",
                    "下载 Windows (x86, 64-bit), ZIP Archive",
                    "解压到 C:\\mysql"
                ]
            },
            {
                "step": 2,
                "description": "创建配置文件",
                "actions": [
                    f"在 {self.install_path} 目录创建 my.ini",
                    "配置基本参数"
                ]
            },
            {
                "step": 3,
                "description": "初始化数据目录",
                "actions": [
                    "以管理员身份打开命令提示符",
                    "cd C:\\mysql\\bin",
                    "mysqld --initialize --console"
                ]
            },
            {
                "step": 4,
                "description": "安装服务",
                "actions": [
                    "mysqld --install MySQL80",
                    "net start MySQL80"
                ]
            }
        ]
        
        for step in steps:
            print(f"\n步骤 {step['step']}: {step['description']}")
            for action in step['actions']:
                print(f"  - {action}")
    
    def create_config_file(self):
        """创建配置文件"""
        config_content = f"""
# MySQL配置文件 my.ini
[mysqld]
# 设置3306端口
port=3306

# 设置mysql的安装目录
basedir={self.install_path}

# 设置mysql数据库的数据的存放目录
datadir={self.data_path}

# 允许最大连接数
max_connections=200

# 允许连接失败的次数
max_connect_errors=10

# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 默认使用"mysql_native_password"插件认证
default_authentication_plugin=mysql_native_password

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
"""
        
        print("\nmy.ini配置文件内容:")
        print("=" * 40)
        print(config_content)

# ZIP包安装演示
zip_installer = WindowsZipInstaller()
zip_installer.zip_installation_steps()
zip_installer.create_config_file()

2.4 Docker容器安装

2.4.1 Docker基础安装

class DockerMySQLInstaller:
    def __init__(self):
        self.image_name = "mysql:8.0"
        self.container_name = "mysql-server"
        self.port = 3306
        self.root_password = "MyStrongPassword123!"
    
    def basic_installation(self):
        """基础Docker安装"""
        print("Docker MySQL基础安装:")
        print("=" * 40)
        
        commands = [
            {
                "description": "拉取MySQL镜像",
                "command": f"docker pull {self.image_name}"
            },
            {
                "description": "运行MySQL容器",
                "command": f"""docker run -d \\
  --name {self.container_name} \\
  -p {self.port}:{self.port} \\
  -e MYSQL_ROOT_PASSWORD={self.root_password} \\
  {self.image_name}"""
            },
            {
                "description": "检查容器状态",
                "command": "docker ps"
            },
            {
                "description": "连接到MySQL",
                "command": f"docker exec -it {self.container_name} mysql -u root -p"
            }
        ]
        
        for cmd in commands:
            print(f"\n{cmd['description']}:")
            print(f"  {cmd['command']}")
    
    def advanced_configuration(self):
        """高级配置"""
        print("\nDocker MySQL高级配置:")
        print("=" * 40)
        
        # Docker Compose配置
        compose_content = f"""
version: '3.8'

services:
  mysql:
    image: {self.image_name}
    container_name: {self.container_name}
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: {self.root_password}
      MYSQL_DATABASE: testdb
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpass
    ports:
      - "{self.port}:{self.port}"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./conf:/etc/mysql/conf.d
      - ./init:/docker-entrypoint-initdb.d
    command: --default-authentication-plugin=mysql_native_password
    
volumes:
  mysql_data:
"""
        
        print("docker-compose.yml:")
        print(compose_content)
        
        print("\n使用Docker Compose:")
        compose_commands = [
            "docker-compose up -d",
            "docker-compose ps",
            "docker-compose logs mysql",
            "docker-compose down"
        ]
        
        for cmd in compose_commands:
            print(f"  {cmd}")
    
    def data_persistence(self):
        """数据持久化"""
        print("\n数据持久化配置:")
        print("=" * 30)
        
        persistence_methods = {
            "命名卷": {
                "创建卷": "docker volume create mysql_data",
                "使用卷": f"docker run -v mysql_data:/var/lib/mysql {self.image_name}"
            },
            "绑定挂载": {
                "创建目录": "mkdir -p /opt/mysql/data",
                "挂载目录": f"docker run -v /opt/mysql/data:/var/lib/mysql {self.image_name}"
            },
            "配置文件挂载": {
                "创建配置目录": "mkdir -p /opt/mysql/conf",
                "挂载配置": f"docker run -v /opt/mysql/conf:/etc/mysql/conf.d {self.image_name}"
            }
        }
        
        for method, commands in persistence_methods.items():
            print(f"\n{method}:")
            for desc, cmd in commands.items():
                print(f"  {desc}: {cmd}")

# Docker安装演示
docker_installer = DockerMySQLInstaller()
docker_installer.basic_installation()
docker_installer.advanced_configuration()
docker_installer.data_persistence()

2.4.2 Docker集群部署

class DockerMySQLCluster:
    def __init__(self):
        self.master_container = "mysql-master"
        self.slave_container = "mysql-slave"
        self.network_name = "mysql-cluster"
    
    def create_cluster(self):
        """创建MySQL主从集群"""
        print("Docker MySQL主从集群部署:")
        print("=" * 50)
        
        # 创建网络
        print("1. 创建Docker网络:")
        print(f"  docker network create {self.network_name}")
        
        # 主服务器配置
        print("\n2. 启动主服务器:")
        master_cmd = f"""
docker run -d \\
  --name {self.master_container} \\
  --network {self.network_name} \\
  -p 3306:3306 \\
  -e MYSQL_ROOT_PASSWORD=master123 \\
  -e MYSQL_REPLICATION_USER=repl \\
  -e MYSQL_REPLICATION_PASSWORD=repl123 \\
  -v master_data:/var/lib/mysql \\
  -v ./master.cnf:/etc/mysql/conf.d/master.cnf \\
  mysql:8.0
"""
        print(f"  {master_cmd}")
        
        # 从服务器配置
        print("\n3. 启动从服务器:")
        slave_cmd = f"""
docker run -d \\
  --name {self.slave_container} \\
  --network {self.network_name} \\
  -p 3307:3306 \\
  -e MYSQL_ROOT_PASSWORD=slave123 \\
  -v slave_data:/var/lib/mysql \\
  -v ./slave.cnf:/etc/mysql/conf.d/slave.cnf \\
  mysql:8.0
"""
        print(f"  {slave_cmd}")
    
    def create_config_files(self):
        """创建配置文件"""
        print("\n配置文件:")
        print("=" * 20)
        
        # 主服务器配置
        master_config = """
# master.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
binlog-do-db=testdb
"""
        
        # 从服务器配置
        slave_config = """
# slave.cnf
[mysqld]
server-id=2
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1
"""
        
        print("master.cnf:")
        print(master_config)
        print("\nslave.cnf:")
        print(slave_config)
    
    def setup_replication(self):
        """设置主从复制"""
        print("\n设置主从复制:")
        print("=" * 30)
        
        replication_steps = [
            {
                "step": "1. 在主服务器创建复制用户",
                "commands": [
                    f"docker exec -it {self.master_container} mysql -u root -p",
                    "CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';",
                    "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';",
                    "FLUSH PRIVILEGES;",
                    "SHOW MASTER STATUS;"
                ]
            },
            {
                "step": "2. 在从服务器配置复制",
                "commands": [
                    f"docker exec -it {self.slave_container} mysql -u root -p",
                    "CHANGE MASTER TO",
                    "  MASTER_HOST='mysql-master',",
                    "  MASTER_USER='repl',",
                    "  MASTER_PASSWORD='repl123',",
                    "  MASTER_LOG_FILE='mysql-bin.000001',",
                    "  MASTER_LOG_POS=0;",
                    "START SLAVE;",
                    "SHOW SLAVE STATUS\\G;"
                ]
            }
        ]
        
        for step in replication_steps:
            print(f"\n{step['step']}:")
            for cmd in step['commands']:
                print(f"  {cmd}")

# Docker集群演示
cluster = DockerMySQLCluster()
cluster.create_cluster()
cluster.create_config_files()
cluster.setup_replication()

2.5 配置文件详解

2.5.1 my.cnf配置结构

class MySQLConfigManager:
    def __init__(self):
        self.config_sections = {
            "[mysqld]": "MySQL服务器配置",
            "[mysql]": "MySQL客户端配置",
            "[client]": "所有客户端程序配置",
            "[mysqldump]": "mysqldump工具配置",
            "[mysqladmin]": "mysqladmin工具配置"
        }
    
    def show_config_structure(self):
        """显示配置文件结构"""
        print("MySQL配置文件结构:")
        print("=" * 40)
        
        for section, description in self.config_sections.items():
            print(f"{section}: {description}")
    
    def generate_basic_config(self):
        """生成基础配置"""
        config = """
# MySQL基础配置文件
# /etc/my.cnf (Linux) 或 my.ini (Windows)

[mysqld]
# 基本设置
port = 3306
socket = /var/lib/mysql/mysql.sock
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

# 连接设置
max_connections = 1000
max_connect_errors = 100000
max_allowed_packet = 64M
interactive_timeout = 28800
wait_timeout = 28800

# InnoDB设置
default-storage-engine = InnoDB
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

# 日志设置
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

# 二进制日志
log-bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M

[mysql]
default-character-set = utf8mb4

[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set = utf8mb4
"""
        
        print("\n基础配置文件:")
        print("=" * 30)
        print(config)
    
    def performance_tuning_config(self):
        """性能调优配置"""
        print("\n性能调优配置:")
        print("=" * 30)
        
        tuning_params = {
            "内存相关": {
                "innodb_buffer_pool_size": "设置为物理内存的70-80%",
                "key_buffer_size": "MyISAM索引缓存,默认256M",
                "query_cache_size": "查询缓存大小,建议64M-256M",
                "tmp_table_size": "临时表大小,建议64M-256M",
                "max_heap_table_size": "内存表最大大小"
            },
            "连接相关": {
                "max_connections": "最大连接数,根据并发需求设置",
                "thread_cache_size": "线程缓存大小,建议8-64",
                "table_open_cache": "表缓存大小,建议2000-4000",
                "open_files_limit": "打开文件数限制"
            },
            "InnoDB相关": {
                "innodb_log_file_size": "日志文件大小,建议256M-1G",
                "innodb_log_buffer_size": "日志缓冲区大小,建议16M-64M",
                "innodb_flush_method": "刷新方法,Linux建议O_DIRECT",
                "innodb_io_capacity": "IO容量,SSD建议2000-4000"
            }
        }
        
        for category, params in tuning_params.items():
            print(f"\n{category}:")
            for param, description in params.items():
                print(f"  {param}: {description}")

# 配置管理演示
config_manager = MySQLConfigManager()
config_manager.show_config_structure()
config_manager.generate_basic_config()
config_manager.performance_tuning_config()

2.5.2 配置参数详解

class MySQLConfigParameters:
    def __init__(self):
        self.parameters = {
            "连接参数": {
                "max_connections": {
                    "默认值": 151,
                    "建议值": "根据并发需求,一般500-2000",
                    "说明": "允许的最大同时连接数"
                },
                "max_connect_errors": {
                    "默认值": 100,
                    "建议值": 100000,
                    "说明": "允许的最大连接错误次数"
                },
                "connect_timeout": {
                    "默认值": 10,
                    "建议值": "10-30",
                    "说明": "连接超时时间(秒)"
                }
            },
            "缓存参数": {
                "innodb_buffer_pool_size": {
                    "默认值": "128M",
                    "建议值": "物理内存的70-80%",
                    "说明": "InnoDB缓冲池大小"
                },
                "query_cache_size": {
                    "默认值": 0,
                    "建议值": "64M-256M",
                    "说明": "查询缓存大小"
                },
                "table_open_cache": {
                    "默认值": 2000,
                    "建议值": "2000-4000",
                    "说明": "表缓存大小"
                }
            },
            "日志参数": {
                "innodb_log_file_size": {
                    "默认值": "48M",
                    "建议值": "256M-1G",
                    "说明": "InnoDB日志文件大小"
                },
                "slow_query_log": {
                    "默认值": "OFF",
                    "建议值": "ON",
                    "说明": "是否启用慢查询日志"
                },
                "long_query_time": {
                    "默认值": 10,
                    "建议值": "1-5",
                    "说明": "慢查询阈值(秒)"
                }
            }
        }
    
    def show_parameters(self):
        """显示配置参数"""
        print("MySQL重要配置参数:")
        print("=" * 60)
        
        for category, params in self.parameters.items():
            print(f"\n{category}:")
            for param_name, param_info in params.items():
                print(f"  {param_name}:")
                print(f"    默认值: {param_info['默认值']}")
                print(f"    建议值: {param_info['建议值']}")
                print(f"    说明: {param_info['说明']}")
    
    def calculate_innodb_buffer_pool(self, total_memory_gb):
        """计算InnoDB缓冲池大小"""
        recommended_size = int(total_memory_gb * 0.75)  # 75%的内存
        
        print(f"\n内存配置建议(总内存: {total_memory_gb}GB):")
        print(f"innodb_buffer_pool_size = {recommended_size}G")
        print(f"剩余内存用于操作系统和其他进程: {total_memory_gb - recommended_size}G")
        
        return f"{recommended_size}G"
    
    def generate_optimized_config(self, memory_gb, cpu_cores, storage_type="SSD"):
        """生成优化配置"""
        buffer_pool_size = int(memory_gb * 0.75)
        max_connections = min(cpu_cores * 100, 2000)
        
        io_capacity = 2000 if storage_type == "SSD" else 200
        
        config = f"""
# 优化配置(内存: {memory_gb}GB, CPU: {cpu_cores}核心, 存储: {storage_type})
[mysqld]
# 连接设置
max_connections = {max_connections}
thread_cache_size = {min(cpu_cores * 2, 64)}

# 内存设置
innodb_buffer_pool_size = {buffer_pool_size}G
innodb_buffer_pool_instances = {min(buffer_pool_size, 8)}

# InnoDB设置
innodb_log_file_size = {min(buffer_pool_size * 256, 1024)}M
innodb_log_buffer_size = {min(buffer_pool_size * 16, 64)}M
innodb_io_capacity = {io_capacity}
innodb_io_capacity_max = {io_capacity * 2}

# 查询缓存
query_cache_size = {min(memory_gb * 32, 256)}M
query_cache_type = 1

# 表缓存
table_open_cache = {cpu_cores * 200}
open_files_limit = {cpu_cores * 1000}
"""
        
        print(f"\n针对硬件的优化配置:")
        print("=" * 40)
        print(config)

# 配置参数演示
config_params = MySQLConfigParameters()
config_params.show_parameters()
config_params.calculate_innodb_buffer_pool(16)  # 16GB内存
config_params.generate_optimized_config(16, 8, "SSD")  # 16GB内存,8核CPU,SSD存储

2.6 安全配置

2.6.1 用户权限管理

class MySQLSecurityManager:
    def __init__(self):
        self.security_checklist = {
            "用户管理": [
                "删除匿名用户",
                "删除test数据库",
                "设置强密码策略",
                "限制root用户远程登录"
            ],
            "网络安全": [
                "配置防火墙规则",
                "使用SSL连接",
                "限制监听地址",
                "修改默认端口"
            ],
            "文件权限": [
                "设置数据目录权限",
                "保护配置文件",
                "限制日志文件访问"
            ]
        }
    
    def security_initialization(self):
        """安全初始化"""
        print("MySQL安全初始化:")
        print("=" * 40)
        
        init_commands = [
            {
                "description": "运行安全脚本",
                "command": "mysql_secure_installation",
                "options": [
                    "设置root密码",
                    "删除匿名用户",
                    "禁止root远程登录",
                    "删除test数据库",
                    "重新加载权限表"
                ]
            },
            {
                "description": "手动安全配置",
                "command": "mysql -u root -p",
                "sql_commands": [
                    "-- 删除匿名用户",
                    "DELETE FROM mysql.user WHERE User='';",
                    "",
                    "-- 删除test数据库",
                    "DROP DATABASE IF EXISTS test;",
                    "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';",
                    "",
                    "-- 限制root用户只能本地登录",
                    "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');",
                    "",
                    "-- 刷新权限",
                    "FLUSH PRIVILEGES;"
                ]
            }
        ]
        
        for cmd in init_commands:
            print(f"\n{cmd['description']}:")
            print(f"  {cmd['command']}")
            if 'options' in cmd:
                for option in cmd['options']:
                    print(f"    - {option}")
            if 'sql_commands' in cmd:
                for sql in cmd['sql_commands']:
                    print(f"    {sql}")
    
    def create_secure_users(self):
        """创建安全用户"""
        print("\n创建安全用户:")
        print("=" * 30)
        
        user_examples = [
            {
                "role": "应用程序用户",
                "username": "app_user",
                "host": "192.168.1.%",
                "privileges": "SELECT, INSERT, UPDATE, DELETE",
                "databases": "app_db"
            },
            {
                "role": "只读用户",
                "username": "readonly_user",
                "host": "%",
                "privileges": "SELECT",
                "databases": "*"
            },
            {
                "role": "备份用户",
                "username": "backup_user",
                "host": "localhost",
                "privileges": "SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER",
                "databases": "*"
            }
        ]
        
        for user in user_examples:
            print(f"\n{user['role']}:")
            print(f"  -- 创建用户")
            print(f"  CREATE USER '{user['username']}'@'{user['host']}' IDENTIFIED BY 'StrongPassword123!';")
            print(f"  -- 授权")
            print(f"  GRANT {user['privileges']} ON {user['databases']}.* TO '{user['username']}'@'{user['host']}';")
            print(f"  -- 刷新权限")
            print(f"  FLUSH PRIVILEGES;")
    
    def ssl_configuration(self):
        """SSL配置"""
        print("\nSSL安全连接配置:")
        print("=" * 40)
        
        ssl_steps = [
            {
                "step": "1. 生成SSL证书",
                "commands": [
                    "# 使用MySQL自带工具生成证书",
                    "mysql_ssl_rsa_setup --datadir=/var/lib/mysql",
                    "",
                    "# 或手动生成证书",
                    "openssl genrsa 2048 > ca-key.pem",
                    "openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem",
                    "openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem",
                    "openssl rsa -in server-key.pem -out server-key.pem",
                    "openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem"
                ]
            },
            {
                "step": "2. 配置MySQL使用SSL",
                "commands": [
                    "# 在my.cnf中添加SSL配置",
                    "[mysqld]",
                    "ssl-ca=/var/lib/mysql/ca.pem",
                    "ssl-cert=/var/lib/mysql/server-cert.pem",
                    "ssl-key=/var/lib/mysql/server-key.pem",
                    "require_secure_transport=ON"
                ]
            },
            {
                "step": "3. 创建需要SSL的用户",
                "commands": [
                    "CREATE USER 'ssl_user'@'%' IDENTIFIED BY 'password' REQUIRE SSL;",
                    "GRANT SELECT ON *.* TO 'ssl_user'@'%';",
                    "FLUSH PRIVILEGES;"
                ]
            },
            {
                "step": "4. 客户端SSL连接",
                "commands": [
                    "mysql -u ssl_user -p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem",
                    "",
                    "# 验证SSL连接",
                    "SHOW STATUS LIKE 'Ssl_cipher';"
                ]
            }
        ]
        
        for step in ssl_steps:
            print(f"\n{step['step']}:")
            for cmd in step['commands']:
                print(f"  {cmd}")

# 安全管理演示
security_manager = MySQLSecurityManager()
security_manager.security_initialization()
security_manager.create_secure_users()
security_manager.ssl_configuration()

2.6.2 防火墙和网络安全

class MySQLNetworkSecurity:
    def __init__(self):
        self.default_port = 3306
        self.custom_port = 3307
    
    def firewall_configuration(self):
        """防火墙配置"""
        print("防火墙配置:")
        print("=" * 30)
        
        firewall_configs = {
            "CentOS/RHEL (firewalld)": [
                f"# 允许MySQL端口",
                f"firewall-cmd --permanent --add-port={self.default_port}/tcp",
                f"firewall-cmd --reload",
                f"",
                f"# 限制特定IP访问",
                f"firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port protocol=tcp port={self.default_port} accept'",
                f"firewall-cmd --reload"
            ],
            "Ubuntu (ufw)": [
                f"# 允许MySQL端口",
                f"ufw allow {self.default_port}/tcp",
                f"",
                f"# 限制特定IP访问",
                f"ufw allow from 192.168.1.0/24 to any port {self.default_port}",
                f"ufw enable"
            ],
            "iptables": [
                f"# 允许MySQL端口",
                f"iptables -A INPUT -p tcp --dport {self.default_port} -j ACCEPT",
                f"",
                f"# 限制特定网段访问",
                f"iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport {self.default_port} -j ACCEPT",
                f"iptables -A INPUT -p tcp --dport {self.default_port} -j DROP",
                f"",
                f"# 保存规则",
                f"iptables-save > /etc/iptables/rules.v4"
            ]
        }
        
        for system, commands in firewall_configs.items():
            print(f"\n{system}:")
            for cmd in commands:
                print(f"  {cmd}")
    
    def network_binding_config(self):
        """网络绑定配置"""
        print("\n网络绑定配置:")
        print("=" * 30)
        
        binding_configs = {
            "只允许本地连接": {
                "配置": "bind-address = 127.0.0.1",
                "说明": "只允许本机连接,最安全"
            },
            "允许内网连接": {
                "配置": "bind-address = 192.168.1.100",
                "说明": "绑定到内网IP,允许内网访问"
            },
            "允许所有连接": {
                "配置": "bind-address = 0.0.0.0",
                "说明": "允许所有IP连接,需配合防火墙使用"
            },
            "多IP绑定": {
                "配置": "bind-address = 127.0.0.1,192.168.1.100",
                "说明": "绑定多个IP地址"
            }
        }
        
        for config_type, config_info in binding_configs.items():
            print(f"\n{config_type}:")
            print(f"  配置: {config_info['配置']}")
            print(f"  说明: {config_info['说明']}")
    
    def port_security(self):
        """端口安全配置"""
        print("\n端口安全配置:")
        print("=" * 30)
        
        port_configs = [
            {
                "策略": "修改默认端口",
                "配置": f"port = {self.custom_port}",
                "优点": "避免自动化扫描攻击",
                "注意": "需要更新防火墙规则和客户端配置"
            },
            {
                "策略": "端口敲门",
                "配置": "使用knockd等工具",
                "优点": "隐藏服务端口",
                "注意": "增加管理复杂度"
            },
            {
                "策略": "VPN访问",
                "配置": "通过VPN隧道访问",
                "优点": "加密传输,安全性高",
                "注意": "需要VPN基础设施"
            }
        ]
        
        for config in port_configs:
            print(f"\n{config['策略']}:")
            print(f"  配置: {config['配置']}")
            print(f"  优点: {config['优点']}")
            print(f"  注意: {config['注意']}")
    
    def connection_limits(self):
        """连接限制配置"""
        print("\n连接限制配置:")
        print("=" * 30)
        
        limit_configs = """
# 连接数限制
max_connections = 1000                    # 最大连接数
max_user_connections = 100               # 单用户最大连接数
max_connect_errors = 100000              # 最大连接错误数

# 超时设置
connect_timeout = 10                     # 连接超时
interactive_timeout = 28800              # 交互超时
wait_timeout = 28800                     # 等待超时
net_read_timeout = 30                    # 网络读取超时
net_write_timeout = 60                   # 网络写入超时

# 连接验证
validate_password.policy = MEDIUM        # 密码策略
validate_password.length = 8             # 最小密码长度
validate_password.mixed_case_count = 1   # 大小写字母数量
validate_password.number_count = 1       # 数字数量
validate_password.special_char_count = 1 # 特殊字符数量
"""
        
        print(limit_configs)

# 网络安全演示
network_security = MySQLNetworkSecurity()
network_security.firewall_configuration()
network_security.network_binding_config()
network_security.port_security()
network_security.connection_limits()

2.7 总结

本章详细介绍了MySQL的安装部署与环境配置,包括:

核心要点

  1. 安装方式:二进制包、源码编译、Docker容器、云服务
  2. 多平台支持:Linux(CentOS/Ubuntu)、Windows、Docker
  3. 配置管理:my.cnf/my.ini配置文件详解
  4. 安全配置:用户权限、SSL加密、网络安全

最佳实践

  1. 安装选择

    • 生产环境推荐二进制包安装
    • 开发测试推荐Docker容器
    • 特殊需求考虑源码编译
  2. 配置优化

    • 根据硬件资源调整内存参数
    • 合理设置连接数和超时时间
    • 启用慢查询日志监控性能
  3. 安全加固

    • 运行mysql_secure_installation
    • 创建专用应用用户
    • 配置防火墙规则
    • 启用SSL加密连接
  4. 运维管理

    • 定期备份配置文件
    • 监控系统资源使用
    • 建立变更管理流程

下一章我们将学习MySQL的基本操作,包括数据库和表的创建、数据的增删改查等基础操作。