PHP脚本导出MySQL数据库

news2024/10/7 4:31:21

背景:有时候需要同步数据库的表结构和部分数据,同步全表数据非常大,也不适合。还有一个种办法是使用数据库的dump命令执行备份,无法进入服务器?没有权限怎么办?

这里只要能访问服务器中的 information_schema数据库就能够进行导出。

1、查询 information_schema 中目标数据库的所有表名和存储引擎。

SELECT table_name,engine 
FROM information_schema.tables 
WHERE table_schema="数据库名";

2、查询 information_schema 中目标数据库的字符集。

SELECT CCSA.character_set_name,T.table_name
FROM information_schema.`TABLES` T,
information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
AND T.table_schema = '数据库名';

3、拿到目标数据库中的所有数据表名之后,查询表结构。

SELECT COLUMN_NAME 数据表的字段名
COLUMN_TYPE 字段的数据类型
COLUMN_COMMENT 字段的注释
COLUMN_DEFAULT 字段的默认值
EXTRA 字段的拓展信息,AUTO_INCREMENT

SELECT COLUMN_NAME,COLUMN_TYPE,COLUMN_COMMENT,COLUMN_DEFAULT,EXTRA 
FROM information_schema.columns 
WHERE table_schema='数据库名' 
AND table_name = '表名'

4、拿到表结构字段信息拼接表结构语句。

CREATE TABLE IF NOT EXISTS pur_accounting_log ( 
	id int(11) auto_increment PRIMARY KEY COMMENT 'ID',
	accounting_time datetime default '0000-00-00 00:00:00' COMMENT '核算时间',
	supplier_code varchar(20) default '' COMMENT '核算维度编码',
	purchase_name varchar(20) default '' COMMENT '核算维度主体',
	is_accounting tinyint(1) default 0 COMMENT '是否核算'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

5、查询表中的前 100 条数据,拼接 INSERT 语句。

 INSERT INTO pur_accounting_log (`id`,`accounting_time`,`supplier_code`,`purchase_name`,`is_accounting`) 
VALUES ('1','2023-09-25 00:00:00','A294494176','HK','0');

完成的代码:

<?php
/**
 * PDO:
 * PHP 数据对象 (PDO :PHP Data Objects) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
 * PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
 */
$filePath           = './down_database.sql';// SQL文件存储位置

const DB_NAME       = 'purchase';// 数据库名称
const DB_HOST       = '127.0.0.1';// 数据库IP
const DB_USERNAME   = 'root';// 用户名
const DB_PASSWORD   = '123456';// 密码
const LIMIT         = 5;
const DSN           = 'mysql:host='.DB_HOST.';dbname=' . DB_NAME;

$options = [
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,// 返回索引数组格式
];
$connectObj = new PDO(DSN, DB_USERNAME, DB_PASSWORD, $options);

// 查询目标数据库中的所有表名称
$query_tables = "SELECT engine,table_name 
    FROM information_schema.tables 
    WHERE table_schema='" . DB_NAME . "'";
$tables_list  = $connectObj->query($query_tables)->fetchAll();

// 查询所有表的存储字符集
$query_tables_charset = "SELECT CCSA.character_set_name,T.table_name
    FROM information_schema.`TABLES` T,
    information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
    WHERE CCSA.collation_name = T.table_collation
    AND T.table_schema = '" . DB_NAME . "'";

$tables_charset  = $connectObj->query($query_tables_charset)->fetchAll();
$tables_charset  = array_column($tables_charset,'character_set_name','table_name');

// 创建数据库并使用它
$create_database = "CREATE DATABASE `" . DB_NAME . "`;\n\n";
$use_database    = "USE `" . DB_NAME . "`;\n\n";

rewriteSqlToFile($filePath, $create_database);
rewriteSqlToFile($filePath, $use_database);

foreach ($tables_list as $value) {
    $table_name = $value['table_name'];
    $engine     = $value['engine'];
    $charset    = isset($tables_charset[$table_name]) ? $tables_charset[$table_name] : null;

    echo "开始导出表:" . DB_NAME . "." . $table_name;
    if (is_numeric($table_name)) {
        echo " ---> 失败:表明为数字无法导出\n";
        continue;
    }

    $query_table = "SELECT COLUMN_NAME,COLUMN_TYPE,COLUMN_COMMENT,COLUMN_DEFAULT,EXTRA 
        FROM information_schema.columns 
        WHERE table_schema='" . DB_NAME . "' 
        AND table_name = '" . $table_name . "'";
    $tables_info = $connectObj->query($query_table)->fetchAll();

    // 拼接表结构
    $create_table_column = '';
    foreach ($tables_info as $column_value) {
        if (stripos($column_value['COLUMN_TYPE'], 'int') !== false) {
            $COLUMN_DEFAULT = intval($column_value['COLUMN_DEFAULT']);
        } else {
            $COLUMN_DEFAULT = "'" . strval($column_value['COLUMN_DEFAULT']) . "'";
        }

        $EXTRA = '';
        if ($column_value['EXTRA'] and $column_value['EXTRA'] == 'auto_increment') {
            $EXTRA = " " . $column_value['EXTRA'] . " PRIMARY KEY";// 自增主键
        } else {
            $EXTRA .= " default " . $COLUMN_DEFAULT;
        }

        $create_table_column .= "\t" . $column_value['COLUMN_NAME']
            . " " . $column_value['COLUMN_TYPE']
            . $EXTRA
            . " COMMENT '" . $column_value['COLUMN_COMMENT'] . "',\r\n";
    }

    $create_table = "CREATE TABLE IF NOT EXISTS " . $table_name . " ( \r\n" .
        trim($create_table_column, ",\r\n") . "\r\n"
        . ") ENGINE=" .$engine;

    if( $charset ) $create_table .= " DEFAULT CHARSET=" . $charset;
    $create_table .= ";\r\n";

    rewriteSqlToFile($filePath, $create_table);


    // 拼接数据集合
    $query_table = "SELECT *
        FROM " . DB_NAME . "." . $table_name . " 
        WHERE 1=1
        LIMIT " . LIMIT;
    $tables_data_list = $connectObj->query($query_table)->fetchAll();

    if($tables_data_list){
        $insert_list = [];
        foreach ($tables_data_list as $item) {
            $row_insert_sql = "INSERT INTO {$table_name} (`" . implode("`,`", array_keys($item)) . "`) "
                . "VALUES ('" . implode("','", array_values($item)) . "');";
            $insert_list[] = $row_insert_sql;
        }

        rewriteSqlToFile($filePath, implode("\r\n", $insert_list));

        rewriteSqlToFile($filePath, "");
        rewriteSqlToFile($filePath, "");
    }

    echo " ---> 成功\n";
}

/**
 * 数据写入到SQL文件中
 * @param $filePath
 * @param $sql
 */
function rewriteSqlToFile($filePath, $sql)
{
    file_put_contents($filePath, $sql . PHP_EOL, FILE_APPEND);
}

echo "同步成功";
exit;

导出过程:

导出SQL的部分示例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端项目练习(练习-003-webpack-01)

学习webpack前&#xff0c;首先&#xff0c;创建一个web-003项目&#xff0c;内容和web-002一样。&#xff08;注意将package.json中的name改为web-003&#xff09; 想想&#xff0c;我们开发Java 的时候&#xff0c;Maven帮我们做的主要是编译&#xff0c;打包等等内容。开发前…

org.quartz.SchedulerConfigException: DataSource name not set.

解决&#xff1a; JobStore配置 原&#xff1a; prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); 改为&#xff1a; prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.qu…

论文笔记:ST2Vec: Spatio-Temporal Trajectory SimilarityLearning in Road Networks

2022 KDD 1 intro 现有的轨迹相似性学习方案强调空间相似性而忽视了时空轨迹的时间维度&#xff0c;这使得它们在有时间感知的场景中效率低下 如上图&#xff0c;在拼车过程中&#xff0c;T1表示司机计划的行程&#xff0c;T2和T3是两个想要搭车的人。T1和T2在空间上更接近&am…

Mac 苹果系统使用nvm use 切换node版本号

windows在使用 nvm 管理并切换 node 时&#xff0c;通过 nvm use 切换node版本会全局切换。也就是node版本号切换后只要不手动更改就会一直保持当前版本号不变。 但博主最近换了苹果系统后&#xff0c;发现苹果系统不能全局更改node版本。我在 vscode中使用nvm use x.x.x之后&…

Django(21):使用Celery任务框架

目录 Celery介绍Celery安装Celery使用项目文件和配置启动Celery编写任务调用异步任务查看任务执行状态及结果 设置定时和周期性任务配置文件添加任务Django Admin添加周期性任务启动任务调度器beat Flower监控任务执行状态Celery高级用法与注意事项给任务设置最大重试次数不同任…

东郊到家app小程序公众号软件开发预约同城服务系统成品源码部署

东郊到家app系统开发&#xff0c;东郊到家软件定制开发&#xff0c;东郊到家小程序APP开发&#xff0c;东郊到家源码定制开发&#xff0c;东郊到家模式系统定制开发 一、上门软件介绍 1、上门app是一家以推拿为主项&#xff0c;个人定制型的o2o平台&#xff0c;上门app平台提…

Nginx的反向代理、动静分离、负载均衡

反向代理 反向代理是一种常见的网络技术&#xff0c;它可以将客户端的请求转发到服务器群集中的一个或多个后端服务器上进行处理&#xff0c;并将响应结果返回给客户端。反向代理技术通常用于提高网站的可伸缩性和可用性&#xff0c;并且可以隐藏真实的后端服务器地址。 #user…

泡泡玛特城市乐园开园在即,知名潮玩IP落地北京朝阳

今年以来&#xff0c;文旅产业成为亮眼消费赛道&#xff0c;大IP主题乐园再次受到市场关注。优质IP可以为园区引流&#xff0c;帮助乐园摆脱门票经济&#xff0c;平衡收入结构。 国内“潮玩第一股”泡泡玛特近日宣布&#xff0c;国内首个潮玩行业沉浸式IP主题乐园——泡泡玛特…

内存对齐--面试常问问题和笔试常考问题

1.内存对齐的意义 C 内存对齐的主要意义可以简练概括为以下几点&#xff1a; 提高访问效率&#xff1a;内存对齐可以使数据在内存中以更加紧凑的方式存储&#xff0c;从而提高了数据的访问效率。处理器通常能够更快地访问内存中对齐的数据&#xff0c;而不需要额外的字节偏移计…

hadoop组件HDFS

HDFS里面的几个组件&#xff0c;分别有哪些功能和作用&#xff1f; Namenode:主角色,负责和客户端进行沟通.Datanode:从角色,负责存储数据Secondary namenode:秘书,服务器数据的收集&#xff0c;将信息传递给namenode注&#xff1a;Namenode宕机时集群会通过选举机制&#xff…

vue安装依赖报错install i 报错提示npm audit fix --force,or `npm audit` for details

vue项目执行npm install初始化后报错 run npm audit fix to fix them, or npm audit for details 出现这类提醒&#xff0c;按照如下操作进行 1、首先安装模块依赖&#xff1a; npm install &#xff08;npm audit fix 含义&#xff1a; 检测项目依赖中的漏洞并自动安装需要…

Java笔记三

包机制&#xff1a; 为了更好地组织类&#xff0c;Java提供了包机制&#xff0c;用于区别类名的命名空间。 包语句的语法格式为&#xff1a;pack pkg1[. pkg2[. pkg3...]]; 般利用公司域名倒置作为包名&#xff1b;如com.baidu.com&#xff0c;如图 导包&#xff1a; 为了能够…

协议-TCP协议-基础概念03-Keep live保活机制-TCP RST-TCP连接

Keep live保活机制-TCP RST-TCP连接 参考来源&#xff1a; 《极客专栏-网络排查案例课》 Keep live保活机制 定时发送心跳探测包&#xff1b; 对于心跳回复包有超时限制&#xff1b; 要打开这个 TCP Keep-alive 特性&#xff0c;你需要使用 setsockopt() 系统调用&#xff0…

Ps:缩放工具

缩放工具 Zoom Tool 常用于对图像进行视图上的放大和缩小。在查看图像细节、处理图像时极为常用。 快捷键&#xff1a;Z ◆ ◆ ◆ 常用操作方法与技巧 1、快捷键 Z 是一个弹簧键。即&#xff0c;在其它工具的状态下&#xff0c;按住 Z 键不放就会临时切换到缩放工具&#xff…

什么是异步编程?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 处理异步操作的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打…

PHP8的继承和多态-PHP8知识详解

我们在前面的时候讲过《面向对象编程的特点》时&#xff0c;面向对象编程具有3大特点&#xff1a;封装性、继承性和多态性。 继承和多态的根本作用就是完成代码的重用。下面就来讲解php8的继承和多态。 1继承 子类可以继承父类的所有成员变量和成员方法&#xff0c;包括构造方…

Spring Boot与Spring Security的跨域解决方案

目录 一、什么是跨域问题 二、Spring Boot和Spring Security介绍 三、如何解决Spring Boot与Spring Security的跨域问题 一、什么是跨域问题 跨域问题&#xff08;Cross-Origin Resource Sharing&#xff0c;简称CORS&#xff09;是指在Web开发中&#xff0c;浏览器出于安全…

美轮美奂,尽在眼前——Aerial for Mac 高清鸟瞰屏保程序

想要让您的 Mac 屏幕焕发别样风采&#xff1f;那么&#xff0c;Aerial for Mac 高清鸟瞰屏保程序一定不容错过。这款应用程序将为您带来最优质的高清鸟瞰视频壁纸&#xff0c;让您的屏幕焕发无限活力和美感。 Aerial for Mac 高清鸟瞰屏保程序是一款专为 Mac 设计的屏幕保护程…

Unity之Hololens开发如何实现UI交互

一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…

Vue组件库Element

目录 Vue组件库ElementElement简介Element快速入门环境配置Element常用组件Table表格Table表格演示Table表格属性详解 Pagination分页Pagination分页演示Pagination分页属性详解Pagination分页事件详解 Dialog对话框Dialog对话框组件演示Dialog对话框属性详解 Form表单Form表单…