나는 원래 백업을 위해 SHOW CREATE TABLE ergodic을 사용하려고 생각했지만, 테이블에 주석이 있고 깨져 있으면 SHOW CREATE TABLE에서 나오는 스크립트에 기호가 누락된다는 사실을 발견했습니다. 그래서 이 버전이 있습니다.
- class MysqlExport{
-
- /**
- * 데이터베이스 연결
- */
- private $_db;
-
- private $_resource;
-
- /**
- * 테이블 구조 sql 생성
- */
- 비공개 $_create_table = '';
-
- 공개 함수 __construct($host = '', $user = '', $ pass = '', $db = '', $port = 3306) {
- if (empty($host) ||empty($user)) {
-
- } else {
- $this ->real_connect($host, $user, $pass, $db, $port);
- }
- }
-
- public function init() {
- return $this;
- }
-
- /**
- * 데이터베이스에 연결
- */
- 공개 함수 real_connect($host, $user, $pass, $db = '', $port = 3306) {
- $this- >_db = mysql_connect($host . ':' . $port, $user, $pass);
- if ($db) {
- $this->select_db($db);
- }
- return $this->init();
- }
-
- /**
- * 데이터베이스 선택
- */
- public function select_db($db) {
- if (mysql_select_db($ db, $this->_db)) {
- return true;
- }
- }
-
- /**
- * 쿼리문
- */
- 공용 함수 쿼리($sql) {
- if ($this->_db) {
- if ($this->_resource = mysql_query($sql, $this->_db)) {
- return $this->init( );
- }
- }
- throw new Exception($this->get_error());
- }
-
- /**
- * 결과 집합 가져오기
- */
- 공개 함수 fetch_array($arg = MYSQL_BOTH) {
- $result = array();
- if ($this->_resource && !mysql_errno($this->_db)) {
- while ($rs = mysql_fetch_array($this->_resource, $arg)) {
- $result[] = $rs;
- }
- }
- return $result;
- }
-
- /**
- * 오류 발생
- */
- public function get_error() {
- return mysql_errno($this->_db) . ": " . mysql_error($this->_db). "n";
- }
-
- /**
- * 데이터 테이블 표시
- */
- 공개 함수 show_tables($table = '') {
- $sql = "SHOW TABLES";
- $sql .= $테이블 ? " LIKE '{$table}'" : '';
- $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
- return $result;
- }
-
- /**
- * 데이터 테이블 필드 표시
- */
- public function show_columns($table) {
- if (empty($table)) {
- return array();
- }
- $sql = "{$table}의 전체 열 표시";
- $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
- return $result;
- }
-
- /**
- * 데이터 테이블 상태 표시
- */
- public function show_table_status($table) {
- if (empty($table)) {
- return array();
- }
- $result = $this->query("'{$table}'과 같은 테이블 상태 표시")->fetch_array(MYSQL_ASSOC);
- $result = 재설정($result);
- $result 반환 ;
- }
-
- /**
- * 데이터 테이블 구조 보기
- */
- 공개 함수 show_create_table($table) {
- if (empty($table)) {
- return '';
- }
- $this->_create_table = "존재하지 않는 경우 테이블 생성 `{$table}`(" . PHP_EOL;
- $table_status = $this->show_table_status($table);
- $columns = $this->show_columns($table);
-
- foreach ($columns AS $col) {
- $this->_create_table .= "`{$col['Field'] }` {$col['Type']} NOT NULL {$col['Extra']}," . PHP_EOL;
- }
-
- $this->_create_table .= $this->create_indexSyntax($table);
-
- $char = substr($table_status['Collation'], 0, strpos($table_status['Collation'], '_'));
- $table_status['Auto_increment'] = $table_status['Auto_increment'] ? $table_status['Auto_increment'] : 0;
- $this->_create_table .= ")Engine={$table_status['Engine']} AUTO_INCREMENT={$table_status['Auto_increment']} DEFAULT CHARSET={$ 숯};" . str_repeat(PHP_EOL, 3);
-
- return $this->_create_table;
- }
-
- /**
- * 트리거 표시
- */
- 공용 함수 show_constraint($db_name) {
- if (empty($db_name)) {
- return array();
- }
- $sql = "SELECT a.CONSTRAINT_NAME AS constrint_name, a.TABLE_name AS table_name, a.COLUMN_NAME AS 컬럼_이름, a.REFERENCED_TABLE_NAME as referenced_column_name, b.UPDATE_RULE as update_rule, b.DELETE_RULE AS delete_rule FROM information_schema.KEY_COLUMN_USAGE AS a LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS AS b ON a.constraint_name=b. 제약_이름 WHERE a.constraint_schema = ' {$db_name}' AND a.POSITION_IN_UNIQUE_CONSTRAINT = 1";
- $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
- }
-
- /**
- * 색인 표시
- */
- 공개 함수 show_index($table) {
- if (empty($table)) {
- return array();
- }
- $sql = "{$table}에서 인덱스 표시";
- $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
- $result 반환;
- }
-
- /**
- * 데이터베이스 구조 표시
- */
- 공개 함수 show_database_char() {
- $sql = "'character_set_database'와 같은 변수 표시";
- $char = $this-> query($sql)->fetch_array(MYSQL_ASSOC);
- return Reset($char);
- }
-
- /**
- * 인덱스 구문 생성
- */
- 공용 함수 create_indexSyntax($table ) {
- if (empty($table)) {
- return array();
- }
- $indexing = $this->show_index($table);
- $syntax = 배열 ();
- $indexSyntax = array();
- foreach ($indexing을 $index로) {
- $syntax[$index['Index_type']][$index['Key_name']][] = $index['Column_name'];
- }
-
- foreach ($syntax as $index_type => $index_value) {
- foreach ($index_value as $key_name => $columns) {
- if ($key_name == 'PRIMARY') {
- $indexSyntax[] = 'PRIMARY KEY (`' . implode("`,`", $columns) . '`)';
- } else {
- if ($index_type == 'FULLTEXT') {
- $indexSyntax[] = "FULLTEXT KEY `{$key_name}` (`" . implode("`,`", $columns) . '`)';
- } else{
- $indexSyntax[] = "KEY `{$key_name}` USING {$index_type} (`" . implode("`,`", $columns) . '` )';
- }
- }
- }
- }
-
- return implode(',' . PHP_EOL, $indexSyntax) . PHP_EOL;
- }
-
- /**
- * 삽입 구문 생성
- */
- 공용 함수 create_insertSyntax($table) {
- if (empty($table)) {
- return '';
- }
- $sql = "SELECT * FROM {$table}";
- $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
- $insertStr = '';
- if ($result) {
- $first = 재설정($result);
- $key = implode('`,`', array_keys($first));
- $insert = "INSERT INTO `{$table}` (`{$key}`) VALUES ";
- $valuesStr = array();
- foreach ($result as $value) {
- $values = array ();
- foreach ($value as $v) {
- $v = mysql_real_escape_string($v);
- $values[] = preg_replace("#\ #", "\", $v) ;
- }
- $valuesStr[] = "('" . implode("','", $values) . "')";
- }
- $valuesStr = array_chunk($valuesStr, 5000);
- foreach ($valuesStr as $str) {
- $insertStr .= $insert . implode(',', $str) . ';' . PHP_EOL;
- }
-
- }
- $insertStr을 반환합니다. str_repeat(PHP_EOL, 3);
- }
-
- }
-
- $export = '';
- $test = new MysqlExport('localhost', 'root', '', 'pm_cms');
- $char = $test->show_database_char();
- $test->query("SET NAMES {$char['Value']}");
- $tables = $test->show_tables();
- foreach ($tables as $table) {
- list($table_name) = array_values($table);
- $export .= $test->show_create_table ($table_name);
- $export .= $test->create_insertSyntax($table_name);
- }
- $fp = fopen('pm_cms.sql', 'w');
- fwrite ($fp, $export);
- fclose($fp);
- ?>
复代码
|