www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > > 充電吧
[導讀]1、緣由自從2010年開始試用ThinkPHP以來,的確帶來了許多方便。的確給我?guī)砹嗽S多方便。此次應為數(shù)據(jù)頻繁備份需要,而每次遠程連接到服務(wù)器頗為不便。變萌生了寫個ThinkPHP數(shù)據(jù)庫備份SQL生

1、緣由

自從2010年開始試用ThinkPHP以來,的確帶來了許多方便。的確給我?guī)砹嗽S多方便。此次應為數(shù)據(jù)頻繁備份需要,而每次遠程連接到服務(wù)器頗為不便。變萌生了寫個ThinkPHP數(shù)據(jù)庫備份SQL生成類的念頭。

2、介紹

由于在數(shù)據(jù)庫中有使用觸發(fā)器。因此也需要一并備份。并且為了插入數(shù)據(jù)的時候不會受到觸發(fā)器影響而破壞先前插入的數(shù)據(jù),在插入數(shù)據(jù)之前生成了刪除觸發(fā)器的代碼。 本類并不能生成數(shù)據(jù)表的創(chuàng)建和刪除代碼,因此在使用中請注意保證兩端表結(jié)構(gòu)的一致。


做WEB開發(fā),一直以來,都采用 Navicat For Mysql 將本地數(shù)據(jù)庫同步到服務(wù)器上。前些天,突然心血來潮,將本地數(shù)據(jù)庫升級到了 Mysql 5.5版本,再次將數(shù)據(jù)同步的時候卻發(fā)生了錯誤。想起之前寫過的?ThinkPHP 實現(xiàn)Mysql數(shù)據(jù)庫備份?只有備份數(shù)據(jù)的功能,而沒有導出表結(jié)構(gòu)的功能。于是想到了升級一下。讓其更完整。

本次升級 增加了 備份表結(jié)構(gòu)、視圖功能。導出數(shù)據(jù)增加了類型判斷,insert 語句當字段為空的時候會輸出 NULL,當為數(shù)字 的時候則不會帶上 單引號。



query("SHOW?FULL?TABLES?FROM?`{$dbName}`?WHERE?Table_Type?=?'BASE?TABLE'");

????????foreach?($result?as?$v){
????????????$tbArray[]=$v['Tables_in_'.C('DB_NAME')];
????????}
????????return?$tbArray;
????}
????static?protected?function?getViews()
????{
????????$dbName=C('DB_NAME');
????????$result=M()->query("SHOW?FULL?TABLES?FROM?`{$dbName}`?WHERE?Table_Type?=?'VIEW'");

????????foreach?($result?as?$v){
????????????$tbArray[]=$v['Tables_in_'.C('DB_NAME')];
????????}
????????return?$tbArray;
????}

????/**
?????*?@description?導出SQL數(shù)據(jù),但不包含表創(chuàng)建代碼。
?????*?@static
?????*?@return?string
?????*/
????static?public?function?ExportAllData()
????{
????????$tables?=?self::getTables();
????????$arrAll?=?array(
????????????"SET?FOREIGN_KEY_CHECKS=0;",
????????????self::BuildAllTriggerDropSql(),
????????????self::BuildTableSql(),
????????????self::BuildViewSql()
????????);
????????$tbl?=?new?Model();
????????foreach($tables?as?$table)
????????{
????????????$arrAll[]="rnDELETE?FROM?{$table};";

????????????/*
????????????$rs?=?$tbl->query("SHOW?COLUMNS?FROM?{$table}");
????????????$arrFields?=?array();
????????????foreach?($rs?as?$k=>&$v){
????????????????$arrFields[]?=?"`{$v['Field']}`";

????????????}

????????????$sqlFields?=?implode($arrFields,",");
????????????*/
????????????$rs=$tbl->query("select?*?from?`{$table}`");
????????????foreach?($rs?as?$k=>&$v){
????????????????$arrValues?=?array();
????????????????foreach($v?as?$key=>$val)
????????????????{
????????????????????if(is_numeric($val)){
????????????????????????$arrValues[]=$val;
????????????????????}else?if(is_null($val)){
????????????????????????$arrValues[]='NULL';
????????????????????}else{
????????????????????????$arrValues[]="'".addslashes($val)."'";
????????????????????}
????????????????}
????????????????$arrAll[]?=?"INSERT?INTO?`{$table}`?VALUES?(".implode(',',$arrValues).");";
????????????}
????????}
????????$arrAll[]=self::BuildTriggerCreateSql();
????????return?implode("rn",$arrAll);
????}

????static?protected?function?BuildTableSql()
????{
????????$tables?=?self::getTables();
????????$arrAll?=?array();
????????foreach($tables?as?&$val){
????????????$rs?=?M()->query("SHOW?CREATE?TABLE?`{$val}`");

????????????$tbSql?=?preg_replace("#CREATE(.*)\s+TABLE#","CREATE?TABLE",$rs[0]['Create?Table']);

????????????$arrAll[]?=?"DROP?TABLE?IF?EXISTS?`{$rs[0]['Table']}`;rn{$tbSql};rn";
????????}

????????return?implode("rn",$arrAll);
????}

????static?protected?function?BuildViewSql()
????{
????????$views?=?self::getViews();
????????$arrAll?=?array();
????????foreach($views?as?&$val){
????????????$rs?=?M()->query("SHOW?CREATE?VIEW?`{$val}`");
????????????$tbSql?=?preg_replace("#CREATE(.*)\s+VIEW#","CREATE?VIEW",$rs[0]['Create?View']);

????????????$arrAll[]?=?"DROP?VIEW?IF?EXISTS?`{$rs[0]['View']}`;rn{$tbSql};rn";
????????}
????????return?implode("rn",$arrAll);
????}
????/**
?????*?@description?如果存在觸發(fā)器,生成刪除代碼。原因是:插入數(shù)據(jù)的時候可能會受到觸發(fā)器影響。
?????*?@static
?????*?@return?string
?????*/
????static?public?function?BuildAllTriggerDropSql()
????{
????????$rs?=?M()->query("show?triggers");
????????$arrAll?=?array();
????????foreach?($rs?as?$k=>&$v)
????????{
????????????$arrSql?=?array(
????????????????'DROP?TRIGGER?IF?EXISTS?`',$v['Trigger'],'`;'
????????????);

????????????$arrAll[]?=?implode('',$arrSql);
????????}
????????return?implode("rn",$arrAll);
????}

????/**
?????*?@description?生成所有觸發(fā)器的創(chuàng)建代碼。
?????*?@static
?????*?@return?string
?????*/
????static?protected?function?BuildTriggerCreateSql()
????{
????????$rs?=?M()->query("show?triggers");
????????$arrAll?=?array();
????????foreach?($rs?as?$k=>&$v)
????????{
????????????$arrSql?=?array(
????????????????'CREATE?TRIGGER?`',$v['Trigger'],'`?',$v['Timing'],'?',$v['Event'],'?ON?`',
????????????????$v['Table'],'`?FOR?EACH?ROW?',$v['Statement'],';'
????????????);

????????????$arrAll[]?=?implode('',$arrSql);
????????}
????????return?implode("rn",$arrAll);
????}
}


調(diào)用示例:


vendor('DBExport',COMMON_PATH);
header('Content-type:?text/plain;?charset=UTF-8');
$dbName?=?C('DB_NAME');
header("Content-Disposition:?attachment;?filename="{$dbName}.sql"");
echo?DBExport::ExportAllData()




本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

關(guān)于gorm框架的簡單運用

關(guān)鍵字: gorm mysql

來源:https://juejin.cn/post/6860252224930070536|?背景日志是?mysql?數(shù)據(jù)庫的重要組成部分,記錄著數(shù)據(jù)庫運行期間各種狀態(tài)信息。mysql日志主要包括錯誤日志、查詢?nèi)罩?、慢?..

關(guān)鍵字: mysql

mysql的一行記錄,最終肯定是存儲在磁盤上,也就是肉眼可見的文件上,今天我們的目標很簡單,就是看看它到底是怎么存的。當然還有一個更重要的目標,就是以這個為引子,帶大家完全通過一手資料,來揭秘這個問題的答案。所以大家閱讀...

關(guān)鍵字: mysql

跟著官方文檔 源碼 源文件三件套自己探索

關(guān)鍵字: mysql 存儲

什么Mysql的事務(wù)?事務(wù)的四大特性?事務(wù)帶來的什么問題?你詳細了解過MVCC嗎?它是怎么工作的?

關(guān)鍵字: mysql 嵌入式

想進大廠,mysql不會那可不行,來接受mysql面試挑戰(zhàn)吧,看看你能堅持到哪里?

關(guān)鍵字: mysql 嵌入式

最近,在開發(fā)一個分庫分表中間件,由于功能需求,需要分析MySQL協(xié)議,發(fā)現(xiàn)網(wǎng)上對于MySQL協(xié)議分析的文章大部分都過時了,原因是分析的MySQL版本太低了。怎么辦?于是乎,我便硬著頭皮開始啃MySQL源碼,經(jīng)過兩個多月的...

關(guān)鍵字: mysql 嵌入式

想進大廠,Mysql不會那可不行,來接受Mysql面試挑戰(zhàn)吧,看看你能堅持到哪里?

關(guān)鍵字: mysql 嵌入式

Explain被稱為執(zhí)行計劃,在語句之前增加explain關(guān)鍵字,MySQL會在查詢上設(shè)置一個標記,模擬MySQL優(yōu)化器來執(zhí)行SQL語句,執(zhí)行查詢時,會返回執(zhí)行計劃的信息,并不執(zhí)行這條SQL。

關(guān)鍵字: mysql 嵌入式

什么是事務(wù)?事務(wù)是應用程序中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務(wù)具有原子性,一個事務(wù)中的一系列的操作要么全部成功,要么一個都不做。

關(guān)鍵字: mysql 嵌入式
關(guān)閉