最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過.ibd文件恢復(fù)MySQL數(shù)據(jù)的全流程

 更新時(shí)間:2025年11月23日 11:36:58   作者:九夜  
.ibd 文件是 InnoDB 存儲(chǔ)引擎的核心數(shù)據(jù)文件,存儲(chǔ)表的行數(shù)據(jù)、索引及元信息,本文主要為大家介紹了通過.ibd文件恢復(fù)MySQL數(shù)據(jù)的全流程,需要的朋友可以參考下

.ibd 文件是 InnoDB 存儲(chǔ)引擎的核心數(shù)據(jù)文件,存儲(chǔ)表的行數(shù)據(jù)、索引及元信息。在僅有 .ibd 文件的情況下,可通過以下流程恢復(fù)數(shù)據(jù)。

一、.ibd 文件基礎(chǔ)認(rèn)知

  • 表空間模式
    • 獨(dú)立表空間(MySQL 5.6+ 默認(rèn)):每張表對(duì)應(yīng)獨(dú)立 .ibd 文件(如 user.ibd),包含表的完整數(shù)據(jù)、索引及元數(shù)據(jù),默認(rèn)存儲(chǔ)于 datadir/數(shù)據(jù)庫名/ 目錄。
    • 系統(tǒng)表空間(舊模式):所有表數(shù)據(jù)集中存儲(chǔ)于 ibdata1 等共享文件,無獨(dú)立 .ibd 文件。
  • 核心特性
    • 二進(jìn)制格式,需通過 MySQL 命令或?qū)S霉ぞ呓馕觯?/li>
    • 依賴 redo 日志保障事務(wù)安全,通過 undo 日志支持 MVCC;
    • 最小 I/O 單位為 16KB 頁,由區(qū)(64 頁)和段(索引對(duì)應(yīng)的區(qū)集合)組成。

二、恢復(fù)工具與流程

使用開源工具 ibd2sql 解析 .ibd 文件,支持提取表結(jié)構(gòu)(DDL)和數(shù)據(jù)(SQL)。

1. 工具準(zhǔn)備

# 下載工具
wget https://github.com/ddcw/ibd2sql/archive/refs/heads/ibd2sql-v2.x.zip
unzip ibd2sql-v2.x.zip
cd ibd2sql-ibd2sql-v2.x/

# 確認(rèn) Python3 環(huán)境
python --version  # 需 Python 3.x

2. 單文件解析

python3 main.py your_file.ibd --sql --ddl

執(zhí)行后生成包含表結(jié)構(gòu)和數(shù)據(jù)的 SQL 文件。

三、批量處理腳本

當(dāng)存在大量 .ibd 文件時(shí),使用以下腳本批量解析:

import os
import sys
import subprocess
from datetime import datetime
from pathlib import Path

# ===================== 配置參數(shù)(按需修改)=====================
ROOT_DIR = Path(__file__).resolve().parent
SOURCE_IBD_DIR = Path(os.path.expanduser("./input_ibd")).resolve()  # 源 ibd 目錄
OUTPUT_SQL_DIR = Path(os.path.expanduser("./output_sql")).resolve()  # 輸出 SQL 目錄
PYTHON_CMD = sys.executable or "python3"  # 使用當(dāng)前 python
MAIN_SCRIPT = ROOT_DIR / "main.py"
# ===============================================================

OUTPUT_SQL_DIR.mkdir(parents=True, exist_ok=True)

# 日志文件(macOS 下默認(rèn)編碼為 UTF-8,無需額外設(shè)置)
LOG_FILE = OUTPUT_SQL_DIR / f"parse_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log"

def log(info, level="INFO"):
    """日志輸出(控制臺(tái) + 文件)"""
    msg = f"[{level}] [{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {info}"
    print(msg)
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(msg + "\n")

def parse_single_ibd(ibd_file_path: Path) -> bool:
    """調(diào)用官方 main.py 解析單個(gè) ibd,并將 stdout 寫入同名 .sql 文件"""
    table_name = ibd_file_path.stem
    sql_file = OUTPUT_SQL_DIR / f"{table_name}.sql"
    log(f"開始解析表:{table_name}(文件:{ibd_file_path.name})")

    if not MAIN_SCRIPT.exists():
        log(f"? 未找到 main.py,期望路徑:{MAIN_SCRIPT}", level="ERROR")
        return False

    cmd = [
        PYTHON_CMD,
        str(MAIN_SCRIPT),
        str(ibd_file_path),
        "--sql",
        "--ddl",
    ]

    try:
        with open(sql_file, "w", encoding="utf-8") as sql_fp:
            proc = subprocess.run(
                cmd,
                stdout=sql_fp,
                stderr=subprocess.PIPE,
                text=True,
                cwd=ROOT_DIR,
                check=False,
            )
        if proc.returncode != 0:
            log(f"? 解析失?。ㄍ顺龃a {proc.returncode}):{proc.stderr.strip()}", level="ERROR")
            if sql_file.exists():
                sql_file.unlink()
            return False
        if proc.stderr.strip():
            log(f"??  命令警告:{proc.stderr.strip()}", level="WARNING")
        log(f"? SQL 生成成功:{sql_file}")
        return True
    except FileNotFoundError as exc:
        log(f"? 命令執(zhí)行失?。簕exc}", level="ERROR")
    except Exception as exc:
        log(f"? 未知異常:{exc}", level="ERROR")
    return False

if __name__ == "__main__":
    log("=" * 60)
    log("ibd2sql 批量解析任務(wù)(macOS 版)啟動(dòng)")
    log(f"源 ibd 目錄:{SOURCE_IBD_DIR}")
    log(f"輸出 SQL 目錄:{OUTPUT_SQL_DIR}")
    log("=" * 60 + "\n")

    # 遍歷所有 .ibd 文件(自動(dòng)過濾非 ibd 文件)
    if not SOURCE_IBD_DIR.is_dir():
        log("??  源目錄不存在,請(qǐng)檢查配置!", level="ERROR")
        sys.exit(1)

    ibd_files = sorted(SOURCE_IBD_DIR.glob("*.ibd"))
    total_count = len(ibd_files)
    success_count = 0
    fail_count = 0
    fail_tables = []

    if total_count == 0:
        log("??  未發(fā)現(xiàn) ibd 文件,請(qǐng)檢查源目錄是否正確!", level="WARNING")
        sys.exit(1)

    log(f"發(fā)現(xiàn) {total_count} 個(gè) ibd 文件,開始批量解析...\n")

    for ibd_path in ibd_files:
        if parse_single_ibd(ibd_path):
            success_count += 1
        else:
            fail_count += 1
            fail_tables.append(ibd_path.stem)
        log("-" * 40 + "\n")

    # 輸出統(tǒng)計(jì)結(jié)果
    log("=" * 60)
    log("批量解析任務(wù)結(jié)束")
    log(f"總文件數(shù):{total_count}")
    log(f"成功解析:{success_count} 個(gè)")
    log(f"解析失?。簕fail_count} 個(gè)")
    if fail_tables:
        log(f"失敗表名:{','.join(fail_tables)}", level="ERROR")
    log(f"日志文件:{LOG_FILE}")
    log("=" * 60)

四、SQL 文件修正

解析后的 SQL 可能存在格式問題,需進(jìn)一步處理:

1. 移除 JSON 字段的字符集聲明

MySQL JSON 類型為二進(jìn)制存儲(chǔ),無需指定字符集/排序規(guī)則,腳本如下:

import argparse
import sys
from dataclasses import dataclass
from pathlib import Path
import re

# 默認(rèn)輸出目錄,與 batch_ibd2sql.py 保持一致
DEFAULT_OUTPUT_SQL_DIR = Path(__file__).resolve().parent / "output_sql"

JSON_KEYWORD = re.compile(r"\bjson\b", re.IGNORECASE)
CHARSET_PATTERN = re.compile(r"\s+CHARACTER\s+SET\s+\w+", re.IGNORECASE)
COLLATE_PATTERN = re.compile(r"\s+COLLATE\s+\w+", re.IGNORECASE)
COLUMN_NAME_PATTERN = re.compile(r"`([^`]+)`")


@dataclass
class ProcessResult:
    file_path: Path
    columns: list[str]
    modified: bool


def clean_line(line: str) -> tuple[str, str | None]:
    """
    若該行定義 JSON 字段且指定了字符集/排序規(guī)則,則移除相關(guān)聲明。
    返回 (新行內(nèi)容, 字段名或 None)。
    """
    if not JSON_KEYWORD.search(line):
        return line, None

    has_charset = "CHARACTER SET" in line.upper()
    has_collate = "COLLATE" in line.upper()
    if not (has_charset or has_collate):
        return line, None

    new_line = CHARSET_PATTERN.sub("", line)
    new_line = COLLATE_PATTERN.sub("", new_line)

    if new_line == line:
        return line, None

    match = COLUMN_NAME_PATTERN.search(line)
    column_name = match.group(1) if match else "<unknown>"
    return new_line, column_name


def process_sql_file(file_path: Path, dry_run: bool = False) -> ProcessResult:
    original = file_path.read_text(encoding="utf-8")
    lines = original.splitlines()
    trailing_newline = original.endswith("\n")

    processed_lines = []
    touched_columns: list[str] = []

    for line in lines:
        new_line, column = clean_line(line)
        processed_lines.append(new_line)
        if column is not None:
            touched_columns.append(column)

    modified = bool(touched_columns)
    if modified and not dry_run:
        new_content = "\n".join(processed_lines)
        if trailing_newline:
            new_content += "\n"
        file_path.write_text(new_content, encoding="utf-8")

    return ProcessResult(file_path=file_path, columns=touched_columns, modified=modified)


def iter_sql_files(root_dir: Path):
    for path in sorted(root_dir.rglob("*.sql")):
        if path.is_file():
            yield path


def parse_args():
    parser = argparse.ArgumentParser(
        description="移除 SQL 文件中 JSON 字段的字符集/排序規(guī)則聲明(MySQL JSON 內(nèi)置二進(jìn)制類型無需設(shè)定字符集)。"
    )
    parser.add_argument(
        "-t",
        "--target",
        default=str(DEFAULT_OUTPUT_SQL_DIR),
        help="待掃描的 SQL 目錄,默認(rèn)為項(xiàng)目 output_sql",
    )
    parser.add_argument(
        "--dry-run",
        action="store_true",
        help="僅報(bào)告將要修改的內(nèi)容,不實(shí)際寫回文件",
    )
    return parser.parse_args()


def main():
    args = parse_args()
    target_dir = Path(args.target).expanduser().resolve()

    if not target_dir.is_dir():
        print(f"[ERROR] 目錄不存在:{target_dir}", file=sys.stderr)
        sys.exit(1)

    has_changes = False
    total_files = 0
    total_columns = 0

    for sql_file in iter_sql_files(target_dir):
        total_files += 1
        result = process_sql_file(sql_file, dry_run=args.dry_run)
        if result.modified:
            has_changes = True
            total_columns += len(result.columns)
            state = "DRY-RUN" if args.dry_run else "UPDATED"
            columns_str = ", ".join(result.columns)
            print(f"[{state}] {sql_file} -> {columns_str}")

    if not has_changes:
        print(f"[INFO] 未檢測(cè)到需要處理的 JSON 字段,掃描文件數(shù):{total_files}")
    else:
        mode = "dry-run" if args.dry_run else "write"
        print(
            f"[SUMMARY] 模式={mode}, 處理文件數(shù)={total_files}, 修正字段數(shù)={total_columns}"
        )


if __name__ == "__main__":
    main()

2. 修復(fù)索引注釋格式(可選)

部分表可能存在索引注釋缺少 COMMENT 關(guān)鍵字或引號(hào)的問題,可使用以下腳本修復(fù)(未完全測(cè)試,少量異常表建議手動(dòng)修改):

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
修復(fù) SQL 文件中 KEY/UNIQUE KEY/PRIMARY KEY 注釋缺少 COMMENT 關(guān)鍵字的問題
將類似: KEY `xxx` (`column`) 注釋內(nèi)容
修改為: KEY `xxx` (`column`) COMMENT '注釋內(nèi)容'
同時(shí)處理: UNIQUE KEY, KEY, PRIMARY KEY 等所有索引定義
"""

import os
import re
import sys
from pathlib import Path
from datetime import datetime
from typing import List, Tuple, Dict

# ===================== 配置參數(shù) =====================
OUTPUT_SQL_DIR = Path("./output_sql").resolve()  # 輸出 SQL 目錄
# ===============================================================

# 日志文件
LOG_FILE = OUTPUT_SQL_DIR / f"fix_unique_key_comment_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log"

def log(info: str, level: str = "INFO"):
    """日志輸出(控制臺(tái) + 文件)"""
    msg = f"[{level}] [{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {info}"
    print(msg)
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(msg + "\n")


def find_key_without_comment(content: str) -> List[Tuple[int, str, str, str]]:
    """
    查找所有缺少 COMMENT 關(guān)鍵字的 KEY 定義(包括 UNIQUE KEY, KEY, PRIMARY KEY)
    
    返回: [(行號(hào), 原始行, KEY類型, 匹配的注釋內(nèi)容), ...]
    """
    issues = []
    lines = content.split('\n')
    
    for line_num, line in enumerate(lines, 1):
        # 跳過已經(jīng)有 COMMENT 關(guān)鍵字的行
        if 'COMMENT' in line.upper():
            continue
        
        # 檢查是否包含 KEY 定義
        if 'KEY' not in line.upper():
            continue
        
        line_upper = line.upper()
        match = None
        key_type = None
        
        # 按優(yōu)先級(jí)匹配:PRIMARY KEY > UNIQUE KEY > KEY
        if 'PRIMARY KEY' in line_upper:
            match = re.search(
                r'(PRIMARY\s+KEY\s+[^)]+))\s+([^,\n]+?)(?=\s*[,)]|\s*$)',
                line,
                re.IGNORECASE
            )
            if match:
                key_type = 'PRIMARY KEY'
        elif 'UNIQUE KEY' in line_upper:
            match = re.search(
                r'(UNIQUE\s+KEY\s+[^)]+))\s+([^,\n]+?)(?=\s*[,)]|\s*$)',
                line,
                re.IGNORECASE
            )
            if match:
                key_type = 'UNIQUE KEY'
        elif re.search(r'\bKEY\s+', line, re.IGNORECASE):
            # 普通 KEY,確保不是 UNIQUE KEY 或 PRIMARY KEY
            match = re.search(
                r'(\bKEY\s+[^)]+))\s+([^,\n]+?)(?=\s*[,)]|\s*$)',
                line,
                re.IGNORECASE
            )
            if match:
                key_type = 'KEY'
        
        if match and key_type:
            comment_text = match.group(2).strip().rstrip(',').strip()
            
            # 排除空注釋
            if comment_text:
                issues.append((line_num, line, key_type, comment_text))
    
    return issues


def fix_key_comment(content: str) -> Tuple[str, List[Dict]]:
    """
    修復(fù) KEY 注釋問題(包括 UNIQUE KEY, KEY, PRIMARY KEY)
    
    返回: (修復(fù)后的內(nèi)容, 修復(fù)記錄列表)
    """
    lines = content.split('\n')
    fixes = []
    new_lines = []
    
    for line_num, line in enumerate(lines, 1):
        original_line = line
        fixed = False
        
        # 跳過已經(jīng)有 COMMENT 關(guān)鍵字的行
        if 'COMMENT' in line.upper():
            new_lines.append(line)
            continue
        
        # 檢查是否包含 KEY 定義
        if 'KEY' not in line.upper():
            new_lines.append(line)
            continue
        
        line_upper = line.upper()
        match = None
        key_type = None
        pattern = None
        
        # 按優(yōu)先級(jí)匹配:PRIMARY KEY > UNIQUE KEY > KEY
        if 'PRIMARY KEY' in line_upper:
            pattern = r'(PRIMARY\s+KEY\s+[^)]+))\s+([^,\n]+?)(?=\s*[,)]|\s*$)'
            match = re.search(pattern, line, re.IGNORECASE)
            if match:
                key_type = 'PRIMARY KEY'
        elif 'UNIQUE KEY' in line_upper:
            pattern = r'(UNIQUE\s+KEY\s+[^)]+))\s+([^,\n]+?)(?=\s*[,)]|\s*$)'
            match = re.search(pattern, line, re.IGNORECASE)
            if match:
                key_type = 'UNIQUE KEY'
        elif re.search(r'\bKEY\s+', line, re.IGNORECASE):
            # 普通 KEY,確保不是 UNIQUE KEY 或 PRIMARY KEY
            pattern = r'(\bKEY\s+[^)]+))\s+([^,\n]+?)(?=\s*[,)]|\s*$)'
            match = re.search(pattern, line, re.IGNORECASE)
            if match:
                key_type = 'KEY'
        
        if match and key_type and pattern:
            key_def = match.group(1)
            comment_text = match.group(2).strip()
            
            # 排除空注釋或只是空白字符
            if comment_text and comment_text.strip():
                # 移除末尾的逗號(hào)(如果有)
                comment_text = comment_text.rstrip(',').strip()
                
                # 檢查注釋是否已經(jīng)用引號(hào)包裹
                if not (comment_text.startswith("'") and comment_text.endswith("'")):
                    # 轉(zhuǎn)義單引號(hào)
                    escaped_comment = comment_text.replace("'", "''")
                    # 用單引號(hào)包裹
                    quoted_comment = f"'{escaped_comment}'"
                else:
                    quoted_comment = comment_text
                
                # 使用正則替換
                # 匹配: KEY ... ) 注釋內(nèi)容 [逗號(hào)或行尾]
                # 替換為: KEY ... ) COMMENT '注釋內(nèi)容' [逗號(hào)或行尾]
                new_line = re.sub(
                    pattern,
                    rf'\1 COMMENT {quoted_comment}',
                    line,
                    count=1,
                    flags=re.IGNORECASE
                )
                
                # 確保行尾的逗號(hào)被保留(如果原來有的話)
                if line.rstrip().endswith(',') and not new_line.rstrip().endswith(','):
                    new_line = new_line.rstrip() + ','
                
                fixes.append({
                    'line': line_num,
                    'key_type': key_type,
                    'original': original_line.strip(),
                    'fixed': new_line.strip(),
                    'comment': quoted_comment
                })
                
                new_lines.append(new_line)
                fixed = True
        
        if not fixed:
            new_lines.append(line)
    
    return '\n'.join(new_lines), fixes


def process_sql_file(sql_file: Path) -> Dict:
    """處理單個(gè) SQL 文件"""
    result = {
        'file': str(sql_file),
        'fixed': False,
        'fixes': []
    }
    
    try:
        with open(sql_file, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 查找問題
        issues = find_key_without_comment(content)
        
        if issues:
            # 修復(fù)問題
            new_content, fixes = fix_key_comment(content)
            
            if fixes:
                # 寫回文件
                with open(sql_file, 'w', encoding='utf-8') as f:
                    f.write(new_content)
                
                result['fixed'] = True
                result['fixes'] = fixes
                
                log(f"? 修復(fù)文件: {sql_file.name}")
                for fix in fixes:
                    key_type = fix.get('key_type', 'KEY')
                    log(f"   行 {fix['line']} ({key_type}): {fix['original']}")
                    log(f"   -> {fix['fixed']}")
            else:
                log(f"??  發(fā)現(xiàn)問題但未修復(fù): {sql_file.name}")
        else:
            log(f"?  無問題: {sql_file.name}")
    
    except Exception as e:
        log(f"? 處理文件失敗 {sql_file.name}: {str(e)}", level="ERROR")
        result['error'] = str(e)
    
    return result


def main():
    """主函數(shù)"""
    log("=" * 60)
    log("KEY/UNIQUE KEY/PRIMARY KEY 注釋修復(fù)任務(wù)啟動(dòng)")
    log(f"掃描目錄:{OUTPUT_SQL_DIR}")
    log("=" * 60 + "\n")
    
    if not OUTPUT_SQL_DIR.exists():
        log(f"? 目錄不存在:{OUTPUT_SQL_DIR}", level="ERROR")
        sys.exit(1)
    
    # 查找所有 SQL 文件
    sql_files = sorted(OUTPUT_SQL_DIR.glob("*.sql"))
    total_count = len(sql_files)
    
    if total_count == 0:
        log("??  未發(fā)現(xiàn) SQL 文件", level="WARNING")
        sys.exit(1)
    
    log(f"發(fā)現(xiàn) {total_count} 個(gè) SQL 文件,開始掃描...\n")
    
    # 統(tǒng)計(jì)信息
    fixed_files = []
    total_fixes = 0
    all_fixes_detail = []
    
        # 處理每個(gè)文件
    for sql_file in sql_files:
        result = process_sql_file(sql_file)
        if result['fixed']:
            fixed_files.append(result['file'])
            total_fixes += len(result['fixes'])
            # 為每個(gè)修復(fù)添加文件信息
            for fix in result['fixes']:
                fix['file'] = result['file']
            all_fixes_detail.extend(result['fixes'])
        log("-" * 40 + "\n")
    
    # 輸出統(tǒng)計(jì)結(jié)果
    log("=" * 60)
    log("修復(fù)任務(wù)結(jié)束")
    log(f"總文件數(shù):{total_count}")
    log(f"修復(fù)文件數(shù):{len(fixed_files)}")
    log(f"總修復(fù)數(shù):{total_fixes}")
    log("=" * 60)
    
    # 輸出詳細(xì)修復(fù)信息
    if all_fixes_detail:
        log("\n詳細(xì)修復(fù)信息:")
        log("=" * 60)
        for fix in all_fixes_detail:
            # 從文件路徑中提取文件名
            file_name = Path(fix.get('file', '')).name if 'file' in fix else 'unknown'
            key_type = fix.get('key_type', 'KEY')
            log(f"\n文件: {file_name}")
            log(f"行號(hào): {fix['line']}")
            log(f"類型: {key_type}")
            log(f"原始: {fix['original']}")
            log(f"修復(fù): {fix['fixed']}")
            log(f"注釋: {fix['comment']}")
        log("=" * 60)
    
    log(f"\n日志文件:{LOG_FILE}")


if __name__ == "__main__":
    main()

總結(jié)

通過 ibd2sql 工具結(jié)合批量處理腳本,可高效恢復(fù) .ibd 文件中的數(shù)據(jù)。解析后需注意修正 JSON 字段格式及索引注釋問題,少量異常表建議手動(dòng)調(diào)整以確保數(shù)據(jù)完整性。

以上就是通過.ibd文件恢復(fù)MySQL數(shù)據(jù)的全流程的詳細(xì)內(nèi)容,更多關(guān)于.ibd文件恢復(fù)MySQL數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解MySQL性能優(yōu)化(二)

    詳解MySQL性能優(yōu)化(二)

    本文對(duì)MySQL性能優(yōu)化進(jìn)行了詳細(xì)的總結(jié)與介紹,需要的朋友可以參考下
    2015-08-08
  • Django連接本地mysql數(shù)據(jù)庫(pycharm)的步驟

    Django連接本地mysql數(shù)據(jù)庫(pycharm)的步驟

    這篇文章主要介紹了Django連接本地mysql數(shù)據(jù)庫(pycharm)的步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • MySQL安裝后不能用是什么情況該如何解決

    MySQL安裝后不能用是什么情況該如何解決

    之前安裝過MYSQL好像不用手動(dòng)啟動(dòng)服務(wù),具體也忘記了,但我上回給公司安裝的那個(gè)是要手動(dòng)安裝服務(wù)的,如果mysql剛剛安裝不能用,可能是服務(wù)沒有安裝
    2014-03-03
  • Mysql 驅(qū)動(dòng)程序的程序小結(jié)

    Mysql 驅(qū)動(dòng)程序的程序小結(jié)

    MySQL 驅(qū)動(dòng)程序是連接應(yīng)用程序與 MySQL 數(shù)據(jù)庫的重要組件,根據(jù)不同的編程語言和應(yīng)用場(chǎng)景,MySQL 提供了多種驅(qū)動(dòng)程序,下面就來詳細(xì)的了解一下驅(qū)動(dòng)程序,感興趣的可以了解一下
    2025-11-11
  • mysql 添加索引 mysql 如何創(chuàng)建索引

    mysql 添加索引 mysql 如何創(chuàng)建索引

    本文將介紹mysql 如何創(chuàng)建索引,需要的朋友可以參考下
    2012-11-11
  • CentOS7安裝MySQL8的超級(jí)詳細(xì)教程(無坑!)

    CentOS7安裝MySQL8的超級(jí)詳細(xì)教程(無坑!)

    我們?cè)贚inux系統(tǒng)中,如果要使用關(guān)系型數(shù)據(jù)庫的話,基本都是用的mysql,這篇文章主要給大家介紹了關(guān)于CentOS7安裝MySQL8的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Mysql賬號(hào)管理與引擎相關(guān)功能實(shí)現(xiàn)流程

    Mysql賬號(hào)管理與引擎相關(guān)功能實(shí)現(xiàn)流程

    Mysql中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平、并且最終提供廣泛的不同功能和能力。通過選擇不同的技術(shù),你能夠獲得額外的速度或者功能,從而改善應(yīng)用的整體功能。這些不同的技術(shù)以及配套的相關(guān)功能在MySQL中被稱作存儲(chǔ)引擎
    2022-10-10
  • 淺談MySQL8和MySQL5.7在自增計(jì)數(shù)上的區(qū)別

    淺談MySQL8和MySQL5.7在自增計(jì)數(shù)上的區(qū)別

    MySQL數(shù)據(jù)庫是一款非常流行的開源數(shù)據(jù)庫,其版本升級(jí)迅速,在使用過程中也發(fā)現(xiàn)了不同版本之間存在著一些區(qū)別,本文主要介紹了MySQL8和MySQL5.7在自增計(jì)數(shù)上的區(qū)別,感興趣的可以了解一下
    2023-10-10
  • MySQL高級(jí)查詢之JOIN、子查詢、窗口函數(shù)實(shí)際案例

    MySQL高級(jí)查詢之JOIN、子查詢、窗口函數(shù)實(shí)際案例

    這篇文章主要介紹了MySQL高級(jí)查詢之JOIN、子查詢、窗口函數(shù)實(shí)際案例的相關(guān)資料,JOIN用于多表關(guān)聯(lián)查詢,子查詢用于數(shù)據(jù)篩選和過濾,窗口函數(shù)則提供靈活的數(shù)據(jù)統(tǒng)計(jì)和排名功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • zabbix監(jiān)控mysql的實(shí)例方法

    zabbix監(jiān)控mysql的實(shí)例方法

    在創(chuàng)建監(jiān)控項(xiàng)之前要盡量考慮清楚要監(jiān)控什么,怎么監(jiān)控,監(jiān)控?cái)?shù)據(jù)如何存儲(chǔ),監(jiān)控?cái)?shù)據(jù)如何展現(xiàn),如何處理報(bào)警等。本文主要介紹了zabbix監(jiān)控mysql的實(shí)現(xiàn)方法,感興趣的可以了解一下
    2021-06-06

最新評(píng)論

岗巴县| 阳山县| 唐海县| 繁峙县| 湖南省| 犍为县| 永安市| 固安县| 蓝田县| 宜阳县| 安新县| 德安县| 德令哈市| 达孜县| 辽宁省| 潼南县| 凉城县| 奉贤区| 山东省| 乐安县| 喜德县| 山东| 顺平县| 霞浦县| 鱼台县| 开封市| 三江| 进贤县| 双城市| 清水河县| 晋中市| 襄樊市| 石门县| 娱乐| 新乡县| 南召县| 和平县| 晋宁县| 桃园市| 隆尧县| 海林市|