You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++环境下的MySQL中批量复制数据库所有表及数据

批量复制MySQL数据库所有表的C++实现方案

核心思路

通过查询MySQL系统库information_schema获取源数据库的所有表名,在C++中循环遍历每个表名,依次执行表结构复制和数据插入操作,实现批量复制。


步骤1:获取源数据库的所有表名

使用SQL查询information_schema.TABLES表,筛选指定数据库下的所有表名:

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的源数据库名';

步骤2:C++代码实现批量复制

以下是基于MySQL C API的完整实现代码:

#include <mysql/mysql.h>
#include <iostream>
#include <string>

int main() {
    // 初始化MySQL连接
    MYSQL* conn = mysql_init(nullptr);
    if (!mysql_real_connect(conn, 
                           "localhost",  // 数据库地址
                           "your_username",  // 用户名
                           "your_password",  // 密码
                           nullptr, 
                           3306, 
                           nullptr, 
                           0)) {
        std::cerr << "连接失败: " << mysql_error(conn) << std::endl;
        return 1;
    }

    // 配置源数据库和目标数据库名称
    const std::string src_db = "source_database";
    const std::string dest_db = "target_database";

    // 创建目标数据库(如果不存在)
    std::string create_db_sql = "CREATE DATABASE IF NOT EXISTS `" + dest_db + "`";
    if (mysql_query(conn, create_db_sql.c_str())) {
        std::cerr << "创建目标数据库失败: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    // 切换到目标数据库
    std::string use_db_sql = "USE `" + dest_db + "`";
    if (mysql_query(conn, use_db_sql.c_str())) {
        std::cerr << "切换到目标数据库失败: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    // 查询源数据库的所有表名
    std::string query_tables_sql = "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '" + src_db + "'";
    if (mysql_query(conn, query_tables_sql.c_str())) {
        std::cerr << "查询表名失败: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    MYSQL_RES* result = mysql_store_result(conn);
    if (!result) {
        std::cerr << "获取结果集失败: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    // 遍历每个表,执行复制操作
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(result)) != nullptr) {
        std::string table_name = row[0];
        // 复制表结构
        std::string create_table_sql = "CREATE TABLE IF NOT EXISTS `" + table_name + "` LIKE `" + src_db + "`.`" + table_name + "`";
        if (mysql_query(conn, create_table_sql.c_str())) {
            std::cerr << "创建表 " << table_name << " 失败: " << mysql_error(conn) << std::endl;
            continue;
        }

        // 复制表数据
        std::string insert_data_sql = "INSERT INTO `" + table_name + "` SELECT * FROM `" + src_db + "`.`" + table_name + "`";
        if (mysql_query(conn, insert_data_sql.c_str())) {
            std::cerr << "插入数据到表 " << table_name << " 失败: " << mysql_error(conn) << std::endl;
            continue;
        }

        std::cout << "成功复制表: " << table_name << std::endl;
    }

    // 释放资源
    mysql_free_result(result);
    mysql_close(conn);
    return 0;
}

注意事项

  • 权限要求:确保MySQL账号拥有SELECT源数据库表、CREATE目标数据库/表、INSERT目标表数据的权限。
  • 特殊表名处理:代码中用反引号包裹数据库名和表名,可兼容包含空格、特殊字符的表名。
  • 大表优化:对于数据量极大的表,INSERT INTO SELECT可能导致性能问题,可考虑分批插入或调用mysqldump工具配合C++执行外部命令实现。
  • 重复执行:添加IF NOT EXISTS避免目标表已存在时报错,但如果目标表结构与源表不一致,可能引发数据插入异常。

内容的提问来源于stack exchange,提问作者Charles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:10:20