首頁 > php教程 > php手册 > php mysql备份恢复分卷处理

php mysql备份恢复分卷处理

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-05-25 16:37:46
原創
1016 人瀏覽過

分卷处理就是把握们要处理的数据分成一个个小文件进行处理了,下面我来给大家介绍一个php mysql备份恢复分卷处理类,实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入.

分卷导入类及思路详解

数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东西整合到自己的后台,我需要的是自己东西,于是参照了很多,自己写了一个关于分卷导入类,以方便调用,欢迎大家拍砖.

这里针对分卷文件是以‘_v1.sql’为结尾,实现单个sql文件及分卷sql导入,分卷导入可选择是否当前分卷导入余下分卷,我们只需要直接调用类即可完成.

分别是主机,用户名,密码,数据库名,数据库编码

$db = new DataManage ( 'localhost', 'root', 'root', 'test', 'utf8' );

sql文件,是否只导入单个sql(即如果有其他分卷也不导入).

$db->restore ( './backup/20120516211738_all_v1.sql', false );对应如何去列出备份的sql文件或选择sql之类的,自己去实现,那个不在这个范畴了,也很简单的.

还有目前只实现了数据库导入,关于数据库导出的,正在编写功能,下面是完整的类代码,具体思路及实现代码里面都有说明,这里不在赘述,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

<?php

    /**

     * @author yanue

     * @copyright Copyright (c) 2012 www.phprm.com

     * 说明:分卷文件是以_v1.sql为结尾

     * 功能:实现单个sql文件及分卷sql导入,分卷导入可选择是否当前分卷导入余下分卷

     * 使用方法:

     *

     *

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

    //分别是主机,用户名,密码,数据库名,数据库编码

    $db = new DataManage ( &#39;localhost&#39;, &#39;root&#39;, &#39;root&#39;, &#39;test&#39;, &#39;utf8&#39; );

    //sql文件,是否只导入单个sql(即如果有其他分卷也不导入)

    $db->restore ( &#39;./backup/20120516211738_all_v1.sql&#39;, false );

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

     */

    class DataManage {

     var $db; // 数据库连接

     var $database; // 所用数据库

     var $sqldir; // 数据库备份文件夹

      

     /**

      * 初始化

      *

      * @param string $host

      * @param string $username

      * @param string $password

      * @param string $database

      * @param string $charset

      */

     function __construct($host = &#39;localhost&#39;, $username = &#39;root&#39;, $password = &#39;&#39;, $database = &#39;test&#39;, $charset = &#39;utf8&#39;) {

      $this->host = $host;

      $this->username = $username;

      $this->password = $password;

      $this->database = $database;

      $this->charset = $charset;

      // 连接数据库

      $this->db = mysql_connect ( $this->host, $this->username, $this->password ) or die ( "数据库连接失败." );

      // 选择使用哪个数据库

      mysql_select_db ( $this->database, $this->db ) or die ( "无法打开数据库" );

      // 数据库编码方式

      mysql_query ( &#39;SET NAMES &#39; . $this->charset, $this->db );

     }

      

     /**

      * 导入备份数据

      * 说明:分卷文件格式20120516211738_all_v1.sql

      *

      * @param string $sqlfile

      * @param bool $single

      */

     function restore($sqlfile, $single = FALSE) {

      // 检测文件是否存在

      if (! file_exists ( $sqlfile )) {

       exit ( "文件不存在!请检查" );

      }

      $this->lock ( $this->database );

      // 获取数据库存储位置

      $sqlpath = pathinfo ( $sqlfile );

      $this->sqldir = $sqlpath [&#39;dirname&#39;];

      // 检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷

      $volume = explode ( "_v", $sqlfile );

      $volume_path = $volume [0];

      echo "请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损<br />";

      echo "正在导入备份数据,请稍等!<br />";

      if (emptyempty ( $volume [1] ) || $single) {

       echo "正在导入sql:<span style=&#39;color:#f00;&#39;>" . $sqlfile . &#39;</span><br />&#39;;

       // 没有分卷

       if ($this->_import ( $sqlfile )) {

        echo "数据库导入成功!";

       } else {

        exit ( &#39;数据库导入失败!&#39; );

       }

      } else {

       // 存在分卷,则获取当前是第几分卷,循环执行余下分卷

       $volume_id = explode ( ".sq", $volume [1] );

       // 当前分卷为$volume_id

       $volume_id = intval ( $volume_id [0] );

       while ( $volume_id ) {

        $tmpfile = $volume_path . "_v" . $volume_id . ".sql";

        // 存在其他分卷,继续执行

        if (file_exists ( $tmpfile )) {

         // 执行导入方法

         echo "正在导入分卷$volume_id:<span style=&#39;color:#f00;&#39;>" . $tmpfile . &#39;</span><br />&#39;;

         if ($this->_import ( $tmpfile )) {

      

         } else {

          exit ( "导入分卷$volume_id:<span style=&#39;color:#f00;&#39;>" . $tmpfile . &#39;</span>失败!可能是数据库结构已损坏!请尝试从分卷1开始导入&#39; );

         }

        } else {

         echo "此分卷备份全部导入成功!<br />";

         return;

        }

        $volume_id ++;

       }

      }

     }

      

     /**

      * 将sql导入到数据库(普通导入)

      *

      * @param string $sqlfile

      * @return boolean

      */

     private function _import($sqlfile) {

      $name = basename ( $sqlfile );

      $sqls = file ( $sqlfile );

      foreach ( $sqls as $sql ) {

       str_replace ( "r", "", $sql );

       str_replace ( "n", "", $sql );

       if (! mysql_query ( trim ( $sql ), $this->db ))

        return false;

      }

      return true;

     }

      

     // 关闭数据库连接

     private function close() {

      mysql_close ( $this->db );

     }

      

     // 锁定数据库,以免备份或导入时出错

     private function lock($tablename, $op = "WRITE") {

      if (mysql_query ( "lock tables " . $tablename . " " . $op ))

       return true;

      else

       return false;

     }

      

     // 解锁

     private function unlock() {

      if (mysql_query ( "unlock tables" ))

       return true;

      else

       return false;

     }

      

     // 析构

     function __destruct() {

      mysql_query ( "unlock tables", $this->db );

      mysql_close ( $this->db );

     }

    }

    

登入後複製

mysql备份恢复分卷处理,调用简单.

分卷导入思路:按行读取sql文件,将每一行当作完整的sql语句存到数组再循环执行插入数据库就可以了,但是在创建表语句分了多行,这个需要单独处理,就这个花了我好长时间的.感觉文章好长啊,主要是那个类文件给占用了.

更新说明:

1.去除sql导入的时候排除sql文件里面的注释’– ‘ 从而解决sql中单双引号不能导入

2.单行读取后的sql直接执行,避免重新将sql语句组合到数组中再从数组中读取导入sql,提高效率.

下载地址: https://github.com/yanue/Dbmanage

导出后的sql文件格式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

--

    -- MySQL database dump

    -- Created by DBManage class, Power By yanue. 

    --

    -- 主机: localhost

    -- 生成日期: 2012 年  10 月 06 日 22:32

    -- MySQL版本: 5.1.50-community

    -- PHP 版本: 5.3.9-ZS5.6.0

      

    --

    -- 数据库: `test`

    --

      

    -- -------------------------------------------------------

      

    --

    -- 表的结构aa

    --

      

    DROP TABLE IF EXISTS `aa`;

    CREATE TABLE `aa` (

      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

      `content` text NOT NULL,

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

      

    --

    -- 转存表中的数据 aa

    --

      

    INSERT INTO `aa` VALUES(&#39;1&#39;,&#39;<p id="test"><span class=&#39;hahh&#39; style="line-height:;">我是测试数据 呵呵</span></p>&#39;);

登入後複製

下面是类代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

<?php  <br />

    /** <br>

     * @author yanue <br>

     * @copyright  Copyright (c) 2012 yanue.net <br>

     * @link  http://phprm.com <br>

     * @version 1.1 <br>

     * 创建时间: 2012年5月21日 <br>

     <br>

    更新时间: 2012年10月6日 <br>

    更新说明: 1.去除sql导入的时候排除sql文件里面的注释'-- ' 从而解决sql中单双引号不能导入 <br>

    2.单行读取后的sql直接执行,避免重新将sql语句组合到数组中再从数组中读取导入sql,提高效率 <br>

     <br>

     * 说明:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql) <br>

     * 功能:实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入 <br>

     * 使用方法: <br>

     * <br>

     * ------1. 数据库备份(导出)------------------------------------------------------------ <br>

    //分别是主机,用户名,密码,数据库名,数据库编码 <br>

    $db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); <br>

    // 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) <br>

    $db->backup (); <br>

     * ------2. 数据库恢复(导入)------------------------------------------------------------ <br>

    //分别是主机,用户名,密码,数据库名,数据库编码 <br>

    $db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); <br>

    //参数:sql文件 <br>

    $db->restore ( './backup/20120516211738_all_v1.sql'); <br>

     *---------------------------------------------------------------------- <br>

     */ <br>

    class DbManage { <br>

        var $db// 数据库连接 <br>

        var $database// 所用数据库 <br>

        var $sqldir// 数据库备份文件夹 <br>

        // 换行符 <br>

        private $ds "n"; <br>

        // 存储SQL的变量 <br>

        public $sqlContent ""; <br>

        // 每条sql语句的结尾符 <br>

        public $sqlEnd ";"; <br>

     <br>

        /** <br>

         * 初始化 <br>

         * <br>

         * @param string $host <br>

         * @param string $username <br>

         * @param string $password <br>

         * @param string $database <br>

         * @param string $charset <br>

         */ <br>

        function __construct($host 'localhost'$username 'root'$password ''$database 'test'$charset 'utf8') { <br>

            $this->host = $host; <br>

            $this->username = $username; <br>

            $this->password = $password; <br>

            $this->database = $database; <br>

            $this->charset = $charset; <br>

            set_time_limit(0);//无时间限制 <br>

    @ob_end_flush(); <br>

            // 连接数据库 <br>

            $this->db = @mysql_connect ( $this->host, $this->username, $this->password ) or die'<p><span>Mysql Connect Error : </span>'.mysql_error().'</p>'); <br>

            // 选择使用哪个数据库 <br>

            mysql_select_db ( $this->database, $this->db ) or die('<p><span>Mysql Connect Error:</span>'.mysql_error().'</p>'); <br>

            // 数据库编码方式 <br>

            mysql_query ( 'SET NAMES ' $this->charset, $this->db ); <br>

     <br>

        } <br>

     <br>

        /* <br>

         * 新增查询数据库表 <br>

         */ <br>

        function getTables() { <br>

            $res = mysql_query ( "SHOW TABLES" ); <br>

            $tables array (); <br>

            while $row = mysql_fetch_array ( $res ) ) { <br>

                $tables [] = $row [0]; <br>

            } <br>

            return $tables; <br>

        } <br>

     <br>

        /* <br>

         * <br>

         * ------------------------------------------数据库备份start---------------------------------------------------------- <br>

         */ <br>

     <br>

        /** <br>

         * 数据库备份 <br>

         * 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) <br>

         * <br>

         * @param $string $dir <br>

         * @param int $size <br>

         * @param $string $tablename <br>

         */ <br>

        function backup($tablename ''$dir$size) { <br>

            $dir $dir $dir './backup/'; <br>

            // 创建目录 <br>

            if (! is_dir $dir )) { <br>

                mkdir $dir, 0777, true ) or die '创建文件夹失败' ); <br>

            } <br>

            $size $size $size : 2048; <br>

            $sql ''; <br>

            // 只备份某个表 <br>

            if (! emptyempty ( $tablename )) { <br>

                if(@mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$tablename."'")) == 1) { <br>

                 else { <br>

                    $this->_showMsg('表-<b>' $tablename .'</b>-不存在,请检查!',true); <br>

                    die(); <br>

                } <br>

                $this->_showMsg('正在备份表 <span>' $tablename.'</span>'); <br>

                // 插入dump信息 <br>

                $sql $this->_retrieve (); <br>

                // 插入表结构信息 <br>

                $sql .= $this->_insert_table_structure ( $tablename ); <br>

                // 插入数据 <br>

                $data = mysql_query ( "select * from " $tablename ); <br>

                // 文件名前面部分 <br>

                $filename date 'YmdHis' ) . "_" $tablename; <br>

                // 字段数量 <br>

                $num_fields = mysql_num_fields ( $data ); <br>

                // 第几分卷 <br>

                $p = 1; <br>

                // 循环每条记录 <br>

                while $record = mysql_fetch_array ( $data ) ) { <br>

                    // 单条记录 <br>

                    $sql .= $this->_insert_record ( $tablename$num_fields$record ); <br>

                    // 如果大于分卷大小,则写入文件 <br>

                    if (strlen $sql ) >= $size * 1024) { <br>

                        $file $filename "_v" $p ".sql"; <br>

                        if ($this->_write_file ( $sql$file$dir )) { <br>

                            $this->_showMsg("表-<b>" $tablename "</b>-卷-<b>" $p "</b>-数据备份完成,备份文件 [ <span>" .$dir $file ."</span> ]"); <br>

                        else { <br>

                            $this->_showMsg("备份表 -<b>" $tablename "</b>- 失败",true); <br>

                            return false; <br>

                        } <br>

                        // 下一个分卷 <br>

                        $p ++; <br>

                        // 重置$sql变量为空,重新计算该变量大小 <br>

                        $sql ""; <br>

                    } <br>

                } <br>

                // 及时清除数据 <br>

                unset($data,$record); <br>

                // sql大小不够分卷大小 <br>

                if ($sql != "") { <br>

                    $filename .= "_v" $p ".sql"; <br>

                    if ($this->_write_file ( $sql$filename$dir )) { <br>

                        $this->_showMsg( "表-<b>" $tablename "</b>-卷-<b>" $p "</b>-数据备份完成,备份文件 [ <span>" .$dir $filename ."</span> ]"); <br>

                    else { <br>

                        $this->_showMsg("备份卷-<b>" $p "</b>-失败<br>"); <br>

                        return false; <br>

                    } <br>

                } <br>

                $this->_showMsg("恭喜您! <span>备份成功</span>"); <br>

            else { <br>

                $this->_showMsg('正在备份'); <br>

                // 备份全部表 <br>

                if ($tables = mysql_query ( "show table status from " $this->database )) { <br>

                    $this->_showMsg("读取数据库结构成功!"); <br>

                else { <br>

                    $this->_showMsg("读取数据库结构失败!"); <br>

                    exit ( 0 ); <br>

                } <br>

                // 插入dump信息 <br>

                $sql .= $this->_retrieve (); <br>

                // 文件名前面部分 <br>

                $filename date 'YmdHis' ) . "_all"; <br>

                // 查出所有表 <br>

                $tables = mysql_query ( 'SHOW TABLES' ); <br>

                // 第几分卷 <br>

                $p = 1; <br>

                // 循环所有表 <br>

                while $table = mysql_fetch_array ( $tables ) ) { <br>

                    // 获取表名 <br>

                    $tablename $table [0]; <br>

                    // 获取表结构 <br>

                    $sql .= $this->_insert_table_structure ( $tablename ); <br>

                    $data = mysql_query ( "select * from " $tablename ); <br>

                    $num_fields = mysql_num_fields ( $data ); <br>

     <br>

                    // 循环每条记录 <br>

                    while $record = mysql_fetch_array ( $data ) ) { <br>

                        // 单条记录 <br>

                        $sql .= $this->_insert_record ( $tablename$num_fields$record ); <br>

                        // 如果大于分卷大小,则写入文件 <br>

                        if (strlen $sql ) >= $size * 1000) { <br>

     <br>

                            $file $filename "_v" $p ".sql"; <br>

                            // 写入文件 <br>

                            if ($this->_write_file ( $sql$file$dir )) { <br>

                                $this->_showMsg("-卷-<b>" $p "</b>-数据备份完成,备份文件 [ <span>".$dir.$file."</span> ]"); <br>

                            else { <br>

                                $this->_showMsg("卷-<b>" $p "</b>-备份失败!",true); <br>

                                return false; <br>

                            } <br>

                            // 下一个分卷 <br>

                            $p ++; <br>

                            // 重置$sql变量为空,重新计算该变量大小 <br>

                            $sql ""; <br>

                        } <br>

                    } <br>

                } <br>

                // sql大小不够分卷大小 <br>

                if ($sql != "") { <br>

                    $filename .= "_v" $p ".sql"; <br>

                    if ($this->_write_file ( $sql$filename$dir )) { <br>

                        $this->_showMsg("-卷-<b>" $p "</b>-数据备份完成,备份文件 [ <span>".$dir.$filename."</span> ]"); <br>

                    else { <br>

                        $this->_showMsg("卷-<b>" $p "</b>-备份失败",true); <br>

                        return false; <br>

                    } <br>

                } <br>

                $this->_showMsg("恭喜您! <span>备份成功</span>"); <br>

            } <br>

        } <br>

     <br>

        //  及时输出信息 <br>

        private function _showMsg($msg,$err=false){ <br>

            $err $err "<span>ERROR:</span>" '' ; <br>

            echo "<p>".$err $msg."</p>"; <br>

            flush(); <br>

     <br>

        } <br>

     <br>

        /** <br>

         * 插入数据库备份基础信息 <br>

         * <br>

         * @return string <br>

         */ <br>

        private function _retrieve() { <br>

            $value ''; <br>

            $value .= '--' $this->ds; <br>

            $value .= '-- MySQL database dump' $this->ds; <br>

            $value .= '-- Created by DbManage class, Power By yanue. ' $this->ds; <br>

            $value .= '-- http://yanue.net ' $this->ds; <br>

            $value .= '--' $this->ds; <br>

            $value .= '-- 主机: ' $this->host . $this->ds; <br>

            $value .= '-- 生成日期: ' date 'Y' ) . ' 年  ' date 'm' ) . ' 月 ' date 'd' ) . ' 日 ' date 'H:i' ) . $this->ds; <br>

            $value .= '-- MySQL版本: ' . mysql_get_server_info () . $this->ds; <br>

            $value .= '-- PHP 版本: ' . phpversion () . $this->ds; <br>

            $value .= $this->ds; <br>

            $value .= '--' $this->ds; <br>

            $value .= '-- 数据库: `' $this->database . '`' $this->ds; <br>

            $value .= '--' $this->ds . $this->ds; <br>

            $value .= '-- -------------------------------------------------------'; <br>

            $value .= $this->ds . $this->ds; <br>

            return $value; <br>

        } <br>

     <br>

        /** <br>

         * 插入表结构 <br>

         * <br>

         * @param unknown_type $table <br>

         * @return string <br>

         */ <br>

        private function _insert_table_structure($table) { <br>

            $sql ''; <br>

            $sql .= "--" $this->ds; <br>

            $sql .= "-- 表的结构" $table $this->ds; <br>

            $sql .= "--" $this->ds . $this->ds; <br>

     <br>

            // 如果存在则删除表 <br>

            $sql .= "DROP TABLE IF EXISTS `" $table '`' $this->sqlEnd . $this->ds; <br>

            // 获取详细表信息 <br>

            $res = mysql_query ( 'SHOW CREATE TABLE `' $table '`' ); <br>

            $row = mysql_fetch_array ( $res ); <br>

            $sql .= $row [1]; <br>

            $sql .= $this->sqlEnd . $this->ds; <br>

            // 加上 <br>

            $sql .= $this->ds; <br>

            $sql .= "--" $this->ds; <br>

            $sql .= "-- 转存表中的数据 " $table $this->ds; <br>

            $sql .= "--" $this->ds; <br>

            $sql .= $this->ds; <br>

            return $sql; <br>

        } <br>

     <br>

        /** <br>

         * 插入单条记录 <br>

         * <br>

         * @param string $table <br>

         * @param int $num_fields <br>

         * @param array $record <br>

         * @return string <br>

         */ <br>

        private function _insert_record($table$num_fields$record) { <br>

            // sql字段逗号分割 <br>

            $insert ''; <br>

            $comma ""; <br>

            $insert .= "INSERT INTO `" $table "` VALUES("; <br>

            // 循环每个子段下面的内容 <br>

            for($i = 0; $i 

                $insert .= ($comma "'" . mysql_escape_string ( $record [$i] ) . "'"); <br>

                $comma ","; <br>

            } <br>

            $insert .= ");" $this->ds; <br>

            return $insert; <br>

        } <br>

     <br>

        /** <br>

         * 写入文件 <br>

         * <br>

         * @param string $sql <br>

         * @param string $filename <br>

         * @param string $dir <br>

         * @return boolean <br>

         */ <br>

        private function _write_file($sql$filename$dir) { <br>

            $dir $dir $dir './backup/'; <br>

            // 创建目录 <br>

            if (! is_dir $dir )) { <br>

                mkdir $dir, 0777, true ); <br>

            } <br>

            $re = true; <br>

            if (! @$fp fopen $dir $filename"w+" )) { <br>

                $re = false; <br>

                $this->_showMsg("打开sql文件失败!",true); <br>

            } <br>

            if (! @fwrite ( $fp$sql )) { <br>

                $re = false; <br>

                $this->_showMsg("写入sql文件失败,请文件是否可写",true); <br>

            } <br>

            if (! @fclose ( $fp )) { <br>

                $re = false; <br>

                $this->_showMsg("关闭sql文件失败!",true); <br>

            } <br>

            return $re; <br>

        } <br>

     <br>

        /* <br>

         * <br>

         * -------------------------------上:数据库导出-----------分割线----------下:数据库导入-------------------------------- <br>

         */ <br>

     <br>

        /** <br>

         * 导入备份数据 <br>

         * 说明:分卷文件格式20120516211738_all_v1.sql <br>

         * 参数:文件路径(必填) <br>

         * <br>

         * @param string $sqlfile <br>

         */ <br>

        function restore($sqlfile) { <br>

            // 检测文件是否存在 <br>

            if (! file_exists $sqlfile )) { <br>

                $this->_showMsg("sql文件不存在!请检查",true); <br>

                exit (); <br>

            } <br>

            $this->lock ( $this->database ); <br>

            // 获取数据库存储位置 <br>

            $sqlpath pathinfo $sqlfile ); <br>

            $this->sqldir = $sqlpath ['dirname']; <br>

            // 检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷 <br>

            $volume explode "_v"$sqlfile ); <br>

            $volume_path $volume [0]; <br>

            $this->_showMsg("请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损"); <br>

            $this->_showMsg("正在导入备份数据,请稍等!"); <br>

            if (emptyempty ( $volume [1] )) { <br>

                $this->_showMsg ( "正在导入sql:<span>" $sqlfile '</span>'); <br>

                // 没有分卷 <br>

                if ($this->_import ( $sqlfile )) { <br>

                    $this->_showMsg( "数据库导入成功!"); <br>

                else { <br>

                     $this->_showMsg('数据库导入失败!',true); <br>

                    exit (); <br>

                } <br>

            else { <br>

                // 存在分卷,则获取当前是第几分卷,循环执行余下分卷 <br>

                $volume_id explode ".sq"$volume [1] ); <br>

                // 当前分卷为$volume_id <br>

                $volume_id intval $volume_id [0] ); <br>

                while $volume_id ) { <br>

                    $tmpfile $volume_path "_v" $volume_id ".sql"; <br>

                    // 存在其他分卷,继续执行 <br>

                    if (file_exists $tmpfile )) { <br>

                        // 执行导入方法 <br>

                        $this->msg .= "正在导入分卷 $volume_id :<span>" $tmpfile '</span><br>'; <br>

                        if ($this->_import ( $tmpfile )) { <br>

     <br>

                        else { <br>

                            $volume_id $volume_id $volume_id :1; <br>

                            exit "导入分卷:<span>" $tmpfile '</span>失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' ); <br>

                        } <br>

                    else { <br>

                        $this->msg .= "此分卷备份全部导入成功!<br>"; <br>

                        return; <br>

                    } <br>

                    $volume_id ++; <br>

                } <br>

            }if (emptyempty ( $volume [1] )) { <br>

                $this->_showMsg ( "正在导入sql:<span>" $sqlfile '</span>'); <br>

                // 没有分卷 <br>

                if ($this->_import ( $sqlfile )) { <br>

                    $this->_showMsg( "数据库导入成功!"); <br>

                else { <br>

                     $this->_showMsg('数据库导入失败!',true); <br>

                    exit (); <br>

                } <br>

            else { <br>

                // 存在分卷,则获取当前是第几分卷,循环执行余下分卷 <br>

                $volume_id explode ".sq"$volume [1] ); <br>

                // 当前分卷为$volume_id <br>

                $volume_id intval $volume_id [0] ); <br>

                while $volume_id ) { <br>

                    $tmpfile $volume_path "_v" $volume_id ".sql"; <br>

                    // 存在其他分卷,继续执行 <br>

                    if (file_exists $tmpfile )) { <br>

                        // 执行导入方法 <br>

                        $this->msg .= "正在导入分卷 $volume_id :<span>" $tmpfile '</span><br>'; <br>

                        if ($this->_import ( $tmpfile )) { <br>

     <br>

                        else { <br>

                            $volume_id $volume_id $volume_id :1; <br>

                            exit "导入分卷:<span>" $tmpfile '</span>失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' ); <br>

                        } <br>

                    else { <br>

                        $this->msg .= "此分卷备份全部导入成功!<br>"; <br>

                        return; <br>

                    } <br>

                    $volume_id ++; <br>

                } <br>

            } <br>

        } <br>

     <br>

        /** <br>

         * 将sql导入到数据库(普通导入) <br>

         * <br>

         * @param string $sqlfile <br>

         * @return boolean <br>

         */ <br>

        private function _import($sqlfile) { <br>

            // sql文件包含的sql语句数组 <br>

            $sqls array (); <br>

            $f fopen $sqlfile"rb" ); <br>

            // 创建表缓冲变量 <br>

            $create_table ''; <br>

            while ( ! feof $f ) ) { <br>

                // 读取每一行sql <br>

                $line fgets $f ); <br>

                // 这一步为了将创建表合成完整的sql语句 <br>

                // 

登入後複製
相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
為 MySQL 資料庫和伺服器建立備份
來自於 1970-01-01 08:00:00
0
0
0
從 .ibd 檔案恢復 MySql 表:一個持續的挑戰
來自於 1970-01-01 08:00:00
0
0
0
使用Kubernetes初始化容器在MySQL上運行
來自於 1970-01-01 08:00:00
0
0
0
java - springboot新手學習
來自於 1970-01-01 08:00:00
0
0
0
spring - JavaWeb中 Service 層的事務問題
來自於 1970-01-01 08:00:00
0
0
0
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板