php mysql备份还原类_PHP实现MYSQL备份还原

/**

* mysql备份*/

classMysqlBackup {function __construct($filename, $config) {$this->setFile($filename);$this->con($config);

}/**

* 输出信息*/

private function info($code, $msg) {$json = json_encode(array('code' => $code, 'msg' => $msg),JSON_UNESCAPED_UNICODE);exit($json);

}/**

* --------------------------------------------------

* 数据库

* --------------------------------------------------*/

private $dbHandle;private $database;/**

* 连接

* @param $config array(host,user,password,database);*/

private function con($config) {$this->dbHandle = mysqli_connect($config['host'], $config['user'], $config['password'], $config['database']);if ($this->dbHandle->connect_errno) {$this->info(-1, 'MySQL连接错误:' . $this->dbHandle->connect_error);

}$this->dbHandle->set_charset('utf8');$this->database = $config['database'];

}/**

* 自定义SQL

* @param $sql 条件语句

* @param $bind 条件绑定

* @param $resType 1:select,2:insert,3:delete/update*/

private function sql($sql, $resType = 1) {//执行

$result = $this->dbHandle->query($sql);//返回

if ($resType == 1) {return $result->fetch_all(MYSQLI_ASSOC);

}elseif ($resType == 2) {return $this->dbHandle->insert_id;

}elseif ($resType == 3) {return $this->dbHandle->affected_rows;

}

}/**

* 多语句SQL*/

private function sql_multi($sql) {$result = $this->dbHandle->multi_query($sql);if ($result) {while ($this->dbHandle->more_results() && $this->dbHandle->next_result()) {

}return true;

}else{return false;

}

}/**

* --------------------------------------------------

* 文件操作

* --------------------------------------------------*/

private $filename;/**

* 设置文件*/

private function setFile($filename) {$this->filename = $filename;

}/**

* 写入*/

private function write($string) {//句柄

static $handle = null;if (!$handle) {$handle = fopen($this->filename, 'w+');

}//写入

$res = fwrite($handle, $string);//返回

if ($res === false) {return false;

}return true;

}/**

* 读取*/

private functionread() {//句柄

static $handle = null;if (!$handle) {$handle = fopen($this->filename, 'r');

}//读取

$res = fgets($handle);return substr($res, 0, -strlen($this->split));

}/**

* --------------------------------------------------

* 备份

* --------------------------------------------------*/

//SQL分隔符,不可更改

private $split = ";\r\n";/**

* 表列表*/

private functiongetTable() {//查询

$sql = "SHOW TABLES";$res = $this->sql($sql);//错误

if (!$res) {$this->info(-2, '查询表列表失败!');

}//格式化

$data = array();foreach ($res as $v) {$v = array_values($v);$data[] = $v[0];

}return $data;

}/**

* 表结构*/

private function tableCreate($table) {$res = $this->sql("SHOW CREATE TABLE `$table`");//错误

if (!$res) {$this->info(-2, "查询`$table`表结构失败!");

}//格式化

$res = array_values($res[0]);$res = str_replace(array("\r", "\n"), array('', ''), $res[1]) . $this->split;$drop_sql = "DROP TABLE IF EXISTS `$table`" . $this->split;$res = $drop_sql . $res;//写入

$res = $this->write($res);if (!$res) {$this->info(-3, "导出`$table`表结构失败!");

}return true;

}/**

* 表数据

* 主键模式,表必须设置主键*/

private function tableDataP($table, $start = 0, $len = 200) {//主键名

static $pkey = array();if (empty($pkey[$table])) {$sql = "SELECT k.column_name FROM information_schema.table_constraints t JOIN information_schema.key_column_usage k USING( CONSTRAINT_NAME, table_schema, TABLE_NAME )

WHERE t.constraint_type = 'PRIMARY KEY' AND t.table_schema = '" . $this->database . "' AND t.table_name = '$table' LIMIT 1";$res = $this->sql($sql);if (!$res) {$this->info(-2, '不支持[主键模式]导出数据!');

}$pkey[$table] = $res[0]['column_name'];

}//查询数据

$sql = "SELECT * FROM `$table` WHERE `{$pkey[$table]}` > $start LIMIT $len";$data = $this->sql($sql);//写入

if ($data) {$sql = '';foreach ($data as $row) {$key = '';$value = '';foreach ($row as $k => $v) {$v = $this->dbHandle->real_escape_string($v);$key .= "`$k`,";$value .= "'$v',";

}$sql .= "INSERT INTO `$table`(" . substr($key, 0, -1) . ") VALUES (" . substr($value, 0, -1) . ")" . $this->split;

}$res = $this->write($sql);if (!$res) {$this->info(-3, "导出`$table`表数据失败!");

}//返回

if (count($data) >= $len) {$start = $data[$len - 1][$pkey[$table]];return $start;

}

}//返回

return false;

}/**

* 表数据

* limit模式*/

private function tableDataL($table, $offset = 0, $len = 200) {//查询数据

$sql = "SELECT * FROM `$table` LIMIT $len OFFSET $offset";$data = $this->sql($sql);//写入

if ($data) {$sql = '';foreach ($data as $row) {$key = '';$value = '';foreach ($row as $k => $v) {$v = $this->dbHandle->real_escape_string($v);$key .= "`$k`,";$value .= "'$v',";

}$sql .= "INSERT INTO `$table`(" . substr($key, 0, -1) . ") VALUES (" . substr($value, 0, -1) . ")" . $this->split;

}$res = $this->write($sql);if (!$res) {$this->info(-3, "导出`$table`表数据失败!");

}//返回

if (count($data) >= $len) {$offset += $len;return $offset;

}

}//返回

return false;

}/**

* 导出*/

functionexport() {$tables = $this->getTable();//表结构

foreach ($tables as $v) {$this->tableCreate($v);

}//表数据

foreach ($tables as $v) {$res = 0;for ($i = 0; $i > -1; $i++) {$res = $this->tableDataP($v, $res);if (!$res) {break;

}

}

}return true;

}/**

* --------------------------------------------------

* 导入

* --------------------------------------------------*/

functionimport() {for ($i = 0; $i > -1; $i++) {//批量读取

$sql = '';for ($i = 0; $i < 50; $i++) {$res = $this->read();if (!$res) {break;

}$sql .= $res . ';';

}//批量执行

if ($sql) {$res = $this->sql_multi($sql);if (!$res) {echo $sql;$this->info(-3, '导入失败');

}

}else{break;

}

}return true;

}

}

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

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

相关文章

一个屌丝程序猿的人生(二十七)

“林萧&#xff0c;妈回去了。你一个人在北京照顾好自己&#xff0c;缺钱了给我打电话。”韩霞放下车窗&#xff0c;面色担忧的跟林萧告别。方才来宋刚学校之前&#xff0c;武达浪已经独自一人离开&#xff0c;如今事情已经办妥&#xff0c;韩霞也要赶回老家去了。 “放心吧&am…

采用HttpModules来重写URLS

首先写一个处理URLs重写的类&#xff0c;并且这个类必须继承IHttpHandler接口&#xff0c;以博客园的程序为例&#xff1a; public class UrlReWriteModule : System.Web.IHttpModule { public void Init(HttpApplication context) { context.BeginRequest new EventHandler(c…

js的下拉刷新和上拉加载,基于iScroll v4.2.5

html部分 <div id"wrapper" style"height: 100%"><div id"scroller"><div id"pullDown"></div><ul id"thelist"><li>我是三冰 1</li><li>我是三冰 2</li><li>…

mysql gtid坑_通过mysqlbinlog --skip-gtids恢复后再备份可能造成的坑

版本[rootuz22199 backup]# innobackupex --versioninnobackupex version 2.4.8 Linux (x86_64) (revision id: 97330f7)[rootuz22199 backup]# mysql -e"select version"------------| version |------------| 5.7.18-log |------------源库表结构与数据rootmysqldb…

SqlHelper模板

在实际开发中&#xff0c;我们不会直接使用拼写SQL语句的方法进行数据库操作&#xff0c;而是使用参数化的方法进行数据库操作&#xff0c;这样做的好处很多&#xff0c;不仅提高了程序的健壮性&#xff0c;同时也避免的SQL注入的问题。在这里&#xff0c;笔者为初学者提供一个…

164. Maximum Gap

题目&#xff1a;Given an unsorted array, find the maximum difference between the successive elements in its sorted form. Try to solve it in linear time/space. Return 0 if the array contains less than 2 elements. You may assume all elements in the array are…

java声明和初始化数组_Java 中初始化数组

数组是一种有用的数据类型&#xff0c;用于管理在连续内存位置中建模最好的集合元素。下面是如何有效地使用它们。-- Chris Hermansen&#xff08;作者&#xff09;有使用 C 或者 FORTRAN 语言编程经验的人会对数组的概念很熟悉。它们基本上是一个连续的内存块&#xff0c;其中…

Java第二次实验报告——Java面向对象程序设计

北京电子科技学院&#xff08;BESTI&#xff09;实 验 报 告课程名称&#xff1a;java程序设计实验 班级&#xff1a;1352 姓名&#xff1a;洪韶武 学号&#xff1a;20135219成绩&#xff1a; 指导教师&#xff1a;娄嘉鹏…

IOS 多线程04-GCD详解 底层并发 API

IOS 多线程04-GCD详解 底层并发 API 注&#xff1a;本人是翻译过来&#xff0c;并且加上本人的一点见解。 前言 想要揭示出表面之下深层次的一些可利用的方面。这些底层的 API 提供了大量的灵活性&#xff0c;随之而来的是大量的复杂度和更多的责任。在我们的文章常见的后台实践…

类初始化的一道面试题

下面的代码counter1,counter2输出的结果是什么&#xff0c;把第10行放到12行后面&#xff0c;ounter1,counter2输出的结果是什么&#xff1f; 为什么&#xff1f; 1 public class Test {2 public static void main(String[] args) {3 System.out.println(Singleton…

mac pandas文件路径_Mac进阶必看:如何利用Automator快速获取文件路径

在重装mac os系统后&#xff0c;有的小伙伴会选择手动恢复数据&#xff0c;但是却发现一些软件比如FTP、iterm2、foxmail等这些软件的配置信息没有了&#xff0c;其实数据并没有丢失哦&#xff01;一般情形下数据都会在/Users/dcm/Library下&#xff0c;但是Mac默认是不显示这些…

深入分析Spring 与 Spring MVC容器

spring官方文档中对web容器的说明spring配置文件默认名字——applicationContext.xml参考链接&#xff1a;https://www.cnblogs.com/hujunzheng/p/5673377.htmlSpring的启动过程&#xff1a;首先&#xff0c;对于一个web应用&#xff0c;其部署在web容器中&#xff0c;web容器提…

mysql jpa 批注 视图_通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句...

参考: https://blog.csdn.net/qq465235530/article/details/68064074https://www.cnblogs.com/zj0208/p/6008627.html这里主要说一下怎么用jpa映射一个视图的实体类&#xff0c;其实跟表映射一样&#xff0c;就是需要添加一个空的主键id标识package com.cf.bus.core.rs.templat…

笨办法学C 练习45:一个简单的TCP/IP客户端

练习45&#xff1a;一个简单的TCP/IP客户端 原文&#xff1a;Exercise 45: A Simple TCP/IP Client 译者&#xff1a;飞龙 我打算使用RingBuffer来创建一个非常简单的小型网络测试工具&#xff0c;叫做netclient。为此我需要向Makefile添加一些工具&#xff0c;来处理bin/目录下…

Cppunit 源码 SynchronizedObject

运用C的构造&#xff0c;析构进行&#xff0c;加锁解锁。在函数进入的时候定义临时变量。任何一个分支推出的时候都会调用析构函数。避免多分支出现的问题。 1 #ifndef CPPUNIT_SYNCHRONIZEDOBJECT_H2 #define CPPUNIT_SYNCHRONIZEDOBJECT_H3 4 #include <cppunit/Portabil…

hive安装需要安装mysql区别_HIVE安装系列之一:在Linux中安装mysql,为其作为hive的metastore做准备...

安装mysql的Linux机器是Centos6的系统&#xff0c;机器名字叫combanc05mysql我采用的是5.5版本。安装过程中需要解决新旧版的冲突问题&#xff0c;并允许mysql被远程访问。以便其作为hive的元数据仓库顺利运行。下载到mysql在linux中安装mysql&#xff0c;首先可以到官网去找Li…

数据预处理和特征工程

一、数据预处理 1.数据采集 2.数据格式化&#xff08;存储格式等&#xff09; 3.数据清洗&#xff1a;去掉脏数据 简单直观可以看出的不可能数据 组合或统计属性判定 缺失值处理 1.删除元祖&#xff1a;删除这一条记录或者一列特征&#xff0c;适合记录或者特征占总样本比例很小…

个人作业五:四则运算二

四则运算2 一、设计思路&#xff1a; 1、题目避免重复&#xff1a; (1)利用系统时间来产生随机数&#xff0c;重复率会降低。 (2)建立链表&#xff0c;逐个判断。可读取写入文件。 2、可定制&#xff08;数量/打印方式&#xff09;&#xff1a; (1)格式有默认值; (2)可以选择重…

javascript继承模式原理与示例深入剖析

原型链ECMAScript 中描述了原型链的概念&#xff0c;并将原型链作为实现继承的主要方法。 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。简单回顾一下构造函数、原型和实例的关系&#xff1a;每个构造函数都有一个原型对象&#xff0c;原型对象都包含一…

mysql innodb_sort_buffer_size_mysql优化---第7篇:参数 innodb_buffer_pool_instances设置

摘要&#xff1a;1 innodb_buffer_pool_instances可以开启多个内存缓冲池&#xff0c;把需要缓冲的数据hash到不同的缓冲池中&#xff0c;这样可以并行的内存读写。2 innodb_buffer_pool_instances参数显著的影响测试结果&#xff0c;特别是非常高的 I/O 负载时。3 实验环境下&…