Windows 11系统下Ollama与MySQL 8.0集成开发环境搭建教程

云信安装大师
90
AI 质量分
11 5 月, 2025
7 分钟阅读
0 阅读

Windows 11系统下Ollama与MySQL 8.0集成开发环境搭建教程

引言

在本地开发环境中集成Ollama和MySQL 8.0可以为开发者提供一个强大的AI模型服务与数据库结合的开发平台。本教程将详细介绍如何在Windows 11系统中搭建这一环境,适合初学者跟随操作。

准备工作

系统要求

  • Windows 11操作系统(版本21H2或更高)
  • 至少8GB内存(推荐16GB以上)
  • 50GB可用磁盘空间
  • 稳定的网络连接

需要下载的软件

  1. Docker Desktop for Windows
  2. MySQL Installer for Windows
  3. Git for Windows

第一部分:安装和配置Docker

1.1 安装Docker Desktop

  1. 下载Docker Desktop安装包并运行
  2. 按照向导完成安装,勾选”Use WSL 2 instead of Hyper-V”选项
  3. 安装完成后重启电脑

1.2 验证Docker安装

打开PowerShell或命令提示符,运行以下命令:

代码片段
docker --version
docker run hello-world

如果看到”Docker version”信息和hello-world容器的输出,说明安装成功。

第二部分:部署Ollama服务

2.1 拉取Ollama镜像

在PowerShell中执行:

代码片段
docker pull ollama/ollama:latest

2.2 运行Ollama容器

代码片段
docker run -d -p 11434:11434 --name ollama -v ollama_data:/root/.ollama ollama/ollama:latest

参数说明:
-d: 后台运行容器
-p: 端口映射(主机端口:容器端口)
--name: 指定容器名称
-v: 数据卷挂载,持久化模型数据

2.3 测试Ollama服务

代码片段
curl http://localhost:11434/api/tags

应该能看到返回的JSON格式响应。

第三部分:安装MySQL 8.0

3.1 MySQL安装步骤

  1. 运行MySQL Installer,选择”Custom”安装类型
  2. MySQL Server组件选择8.0.x最新版本(如8.0.36)
  3. MySQL Workbench建议一并安装(可视化工具)
  4. Authentication Method选择”Use Strong Password Encryption”
  5. Root账户设置强密码并记住它

3.2 MySQL环境变量配置

将MySQL的bin目录添加到系统PATH:

代码片段
C:\Program Files\MySQL\MySQL Server X.X\bin

验证安装:

代码片段
mysql --version

MySQL与Ollama集成开发环境配置

Python虚拟环境创建与依赖安装

代码片段
# Python虚拟环境创建(假设已安装Python3.x)
python -m venv ollama_mysql_env
.\ollama_mysql_env\Scripts\activate

# Python依赖包安装(假设使用pip)
pip install mysql-connector-python requests python-dotenv langchain_community sqlalchemy pymysql transformers torch torchvision torchaudio sentencepiece protobuf==3.* 

.env环境配置文件示例

创建.env文件:

代码片段
# MySQL配置
MYSQL_HOST=localhost  
MYSQL_PORT=3306  
MYSQL_USER=root  
MYSQL_PASSWORD=your_secure_password  
MYSQL_DATABASE=ollamadb  

# Ollama配置  
OLLAMA_BASE_URL=http://localhost:11434  
MODEL_NAME=llama2  

Python集成示例代码

创建一个ollama_mysql_integration.py文件:

代码片段
import os  
from dotenv import load_dotenv  
import mysql.connector  
import requests  

# Load environment variables  
load_dotenv()  

def setup_mysql_connection():  
    """建立MySQL数据库连接"""  
    try:  
        conn = mysql.connector.connect(  
            host=os.getenv('MYSQL_HOST'),  
            port=int(os.getenv('MYSQL_PORT')),  
            user=os.getenv('MYSQL_USER'),  
            password=os.getenv('MYSQL_PASSWORD'),  
            database=os.getenv('MYSQL_DATABASE')  
        )  
        print("✅ MySQL连接成功建立")  
        return conn  
    except Exception as e:  
        print(f"❌ MySQL连接失败: {e}")  

def query_ollama(prompt):  
    """向Ollama发送查询请求""" 
    try: 
        response = requests.post(  
            f"{os.getenv('OLLAMA_BASE_URL')}/api/generate", 
            json={ 
                "model": os.getenv('MODEL_NAME'), 
                "prompt": prompt, 
                "stream": False 
            } 
        ) 
        return response.json()['response'] 
    except Exception as e: 
        print(f"❌ Ollama查询失败: {e}") 

def create_tables(conn): 
    """创建必要的数据库表""" 
    cursor = conn.cursor() 

    # SQL语句列表 
    sql_statements = [ 
        """CREATE TABLE IF NOT EXISTS prompts ( 
            id INT AUTO_INCREMENT PRIMARY KEY, 
            prompt_text TEXT NOT NULL, 
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
            source VARCHAR(255) DEFAULT 'user' 
        )""", 

        """CREATE TABLE IF NOT EXISTS responses ( 
            id INT AUTO_INCREMENT PRIMARY KEY, 
            prompt_id INT, 
            response_text TEXT NOT NULL, 
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
            FOREIGN KEY (prompt_id) REFERENCES prompts(id) ON DELETE CASCADE 
        )""" 

    ] 

    try: 
        for statement in sql_statements: 
            cursor.execute(statement) 

        conn.commit() #提交事务 

        print("✅ Tables created successfully") 

    except Exception as e: 

        print(f"❌ Error creating tables: {e}") 

def main(): 

    # Initialize database connection and tables 

    conn = setup_mysql_connection() 

    if conn is None: return # Exit if connection failed 

    create_tables(conn) 

    while True: # Main interaction loop 

        user_input = input("\n请输入你的问题 (输入 'exit'退出): ") 

        if user_input.lower() == 'exit': break 

        try: # Store the prompt in database first 

            cursor = conn.cursor() 

            insert_prompt = "INSERT INTO prompts (prompt_text) VALUES (%s)" 

            cursor.execute(insert_prompt, (user_input,)) 

            prompt_id = cursor.lastrowid # Get the auto-incremented ID of the inserted prompt 

             # Get response from Ollama and store it in database along with the prompt ID reference  

             ai_response = query_ollama(user_input)  

             insert_response = """INSERT INTO responses (prompt_id, response_text) VALUES (%s, %s)"""  

             cursor.execute(insert_response, (prompt_id, ai_response))  

             conn.commit() # Commit both inserts together  

             print(f"\nAI回复:\n{ai_response}\n")  

         except Exception as e:  

             print(f"❌ Error during processing:\n{e}")  

     conn.close() # Close connection when done  

if __name__ == "__main__": main()

SQL优化建议(针对AI应用)

create_tables函数中可以添加以下优化索引:

代码片段
# Add after table creation statements...
optimization_statements = [
    "CREATE FULLTEXT INDEX idx_prompt_text ON prompts(prompt_text)",
    "CREATE INDEX idx_responses_prompt ON responses(prompt_id)",
]
for statement in optimization_statements:
    cursor.execute(statement)
conn.commit()

Ollama模型管理技巧

查看可用模型列表:

代码片段
curl http://localhost:11434/api/tags | jq .

拉取特定模型:

代码片段
docker exec ollama ollama pull llama2-chinese   # Chinese optimized version example...

查看运行中的模型:

代码片段
docker exec ollama ollama list   # List downloaded models...

MySQL性能调优参数(my.cnf)

在MySQL配置文件(my.cnf)中添加以下参数优化AI应用性能:

代码片段
[mysqld]
innodb_buffer_pool_size =4G       # Set to ~70% of available RAM for dedicated DB server...
innodb_log_file_size=512M         # Larger log files for better write performance...
innodb_flush_log_at_trx_commit=0   # For development only! Speeds up writes but less durable...
max_connections=200               # Higher than default to handle more concurrent connections...
query_cache_type=1                # Enable query caching...
query_cache_size=256M             # Size of query cache...   
character-set-server=utf8mb4      # Full Unicode support...   
collation-server=utf8mb4_general_ci   
default-storage-engine=InnoDB   
innodb_file_per_table=ON          # Better file management...   
innodb_read_io_threads=8          # More read threads...   
innodb_write_io_threads=8         # More write threads...   
join_buffer_size=256K             # Larger join buffers...   
sort_buffer_size=512K             # Larger sort buffers...   
read_rnd_buffer_size=512K         # For random reads...   
thread_cache_size=100             # Cache more threads...   
table_open_cache=4000             # More open tables cache...    
tmp_table_size=128M               # Larger temp tables in RAM before disk...    
max_heap_table_size=128M          #

注意:生产环境中不要设置innodb_flush_log_at_trx_commit=0,这会导致数据丢失风险。仅在开发环境中使用此设置。

Docker Compose替代方案(推荐)

创建docker-compose.yml文件统一管理服务:

代码片段
version:'3'   

services:

   ollamadb:

      image:"mysql/mysql-server:8"

      container_name:"mysql_for_ai"

      environment:

         MYSQL_ROOT_PASSWORD:"${DB_ROOT_PASSWORD}"

         MYSQL_DATABASE:"${DB_NAME}"

         MYSQL_USER:"${DB_USER}"

         MYSQL_PASSWORD:"${DB_PASSWORD}"   

      ports:

         -"3306/tcp"

      volumes:

         -"./mysql_data:/var/lib/mysql"

         -"./mysql_init:/docker-entrypoint-initdb.d/"   

      restart:"always"

      command:[ "--character-set-server=utf8mb4","--collation-server=utf8mb4_general_ci","--default-authentication-plugin=caching_sha2_password","--max_allowed_packet=${MAX_ALLOWED_PACKET:-256M}" ]   

   ollamaserver:

      image:"ollamadev/ollamav003beta"

      container_name:"ai_model_server"

      ports:

         -"11434/tcp"

      volumes:

         -"./ollamadata:/root/.ollamastorage/"   

      restart:"always"

      depends_on:

         -"ollamadb"

启动服务:

代码片段
docker-compose up -d --build --force-recreate --remove-orphans --always-recreate-deps --abort-on-container-exit || docker-compose logs --tail="all"

查看日志:

代码片段
docker-compose logs --follow || docker-compose ps --all || docker stats $(docker ps --format='{{ .Names }}')

Windows特定优化技巧

1.WSL内存限制调整:编辑%USERPROFILE%\.wslconfig

代码片段
[wsl2]
memory=<size>GB   ; e.g., memory=16GB for16GB allocation...
processors=<number> ; e.g., processors=6for6CPU cores...
swap=<size>GB     ; e.g., swap32for32GB swap file...
localhostForwarding=true ; Important for local access...
kernelCommandLine=nohibernate ; Prevent hibernation issues...

然后重启WSL实例:wsl--shutdown

2.Windows Defender排除项:将项目目录和Docker数据目录添加到排除列表以减少性能影响。

3.电源管理设置:确保电源计划设置为”高性能”,防止CPU节流。

4.网络优化:对于Windows防火墙,确保允许Docker和MySQL通过防火墙。

5.磁盘性能:如果可能,将项目放在SSD上而非HDD上。

6.定期维护

代码片段
docker system prune--all--force--volumes && docker builder prune--all--force && docker image prune--all && docker container prune && docker volume prune && net stop com.docker.service && net start com.docker.service || taskkill /F /IM "dockerd.exe" /T || taskkill /F /IM "com.docker.proxy.exe"/T || taskkill/F/IM "com.docker.backend.exe"/T || echo"DONE..."<br>
   

7.备份策略

代码片段
robocopy"C:\path\to\project""X:\backup\location"/mir /z /xj /r:1/w1/log+:backup.log||echo"Cannot complete backup..."<br>
   

FAQ常见问题解答

Q:为什么我的Ollamaserver无法连接到本地主机?

A:可能原因和解决方案:

1.WSL网络桥接问题:

代码片段
netsh interface ipv4 show excludedportrange protocol=tcp | findstr11434||echo"No conflict detected..."

如果有冲突端口:

代码片段
net stop winnat&&net start winnat||echo"Cannot restart NAT..."

或者修改端口映射:

代码片段
ports:
-"11435/tcp"

然后更新.env文件中的URL.

Q:如何重置整个环境?

A:完整重置步骤:

1.停止并删除所有容器

代码片段
docker stop $(docker ps-aq)&&docker rm$(docker ps-aq)-f&&echo"DONE..."||echo"No containers to remove..."

2.删除所有卷

代码片段
docker volume prune-f&&echo"DONE..."||echo"No volumes to remove..."

3.删除镜像

代码片段
docker rmi$(docker images-q)-f&&echo"DONE..."||echo"No images to remove..."

4.清理WSL

代码片段
wsl--unregister docker-desktop-data&&wsl--unregister docker-desktop&&echo"DONE..."||echo"Cannot unregister WSL..."

5.重新启动Docker

代码片段
net stop com.docker.service&&net start com.docker.service||taskkill/F/IM "dockerd.exe"/T&&start"""%ProgramFiles%\Docker\Docker\Docker Desktop.exe"

6.重新初始化项目

代码片段
git clean-xdf&&git reset--hard HEAD~10&&git pull origin main||echo"Cannot reset git repo..."

Q:如何监控资源使用情况?

A:监控命令集合:

1.综合监控面板

代码片段
wt-pwsh-nol-nop-c"while($true){clear;Get-Counter'\Processor(_Total)\% Processor Time','\Memory\% Committed Bytes In Use';sleep5}"

或者使用内置资源监视器:

代码片段
perfmon/res|start""explorer shell:::{BB06C0E4-D293-4f75-8A90-CB05B6477EEE}

2.特定于容器的监控

代码片段
watch-dn5-e"--color"-c'dockers stats$(dockers ps--format="{{ .Names }}")'

或者图形化工具:

代码片段
start""http://localhost/stats/

Q:为什么我的模型加载很慢?

A:加速建议:

1.预加载模型到内存
创建一个预加载脚本preload.py:

代码片段
from transformers import AutoModelForCausalLM,AutoTokenizer;model_name="meta-llamallamav003beta";tokenizerAutoTokenizer.frompretrained(modelname);modelAutoModelForCausalLM.frompretrained(modelname);print("Model loaded successfully!")

然后运行:

代码片段
python preload.py|out-null|echook!

2.调整批处理大小
修改.env文件添加:

代码片段
BATCH_SIZE_TRAIN64|BATCH_SIZE_INFER32|MAX_SEQ_LEN4096|USE_FP16_TRUE|OPTIMIZE_FOR_SIZE_FALSE|
USE_CUDA_TRUE|CUDA_VISIBLE_DEVICES="0"

3.硬件加速检查
确保正确识别GPU:

代码片段
nvidia-smi-l1|findstr CUDA||dxdiag/exportsummary.txt|findstr/i"(card)|(chip)|(memory)|(directx)"

Q:如何备份我的聊天记录和训练数据?

A:备份方案:

1.自动每日备份脚本 backup.bat

代码片段
@ECHOOFF SETLOCAL SETBACKUPDIR=%USERPROFILE%\Documents\AIbackups SETTIMESTAMP=%DATE:~10%%DATE:~7%%DATE:~4%%TIME:~%%TIME:~3% SETTIMESTAMP=%TIMESTAMP::=% SETTIMESTAMP=%TIMESTAMP:.=% MD"%BACKUPDIR%\%TIMESTAMP%"22 COPY".\.env""%BACKUPDIR%\%TIMESTAMP%" COPY".\*.py""%BACKUPDIR%\%TIMESTAMP%" COPY".\*.json""%BACKUPDIR%\%TIMESTAMP%" COPY".\*.md""%BACKUPDIR%\%TIMESTAMP%" ECHOBackup completed to%BACKUPDIR%\%TIMESTAMP%
PAUSE EXIT/B%

2.数据库导出自动化
创建scheduled_task.sql

代码片段
SELECT*INTO OUTFILE'/var/lib/mysql-files/full_backup.sql'FROM prompts UNION ALL SELECT*FROM responses;<br>
 

然后设置计划任务每周运行:

代码片段
schtasks/create/scweekly/tn"AIDatabaseBackup"/tr"\""C:\Program Files\MySQL\MySQL Server X.X\\bin\\mysqldump.exe\"-u root-pPASSWORD ollamadb>\""C:\\backups\\sqldump\\ai_backup_$(date+%%Y%%m%%d).sql\"\""<br>
 

Q:如何升级到新版本而不丢失数据?

A:安全升级步骤:

1)**首先

原创 高质量