MySQL 백업

WBOY
풀어 주다: 2016-07-25 08:50:37
원래의
777명이 탐색했습니다.
나는 원래 백업을 위해 SHOW CREATE TABLE ergodic을 사용하려고 생각했지만, 테이블에 주석이 있고 깨져 있으면 SHOW CREATE TABLE에서 나오는 스크립트에 기호가 누락된다는 사실을 발견했습니다. 그래서 이 버전이 있습니다.
  1. class MysqlExport{
  2. /**
  3. * 데이터베이스 연결
  4. */
  5. private $_db;
  6. private $_resource;
  7. /**
  8. * 테이블 구조 sql 생성
  9. */
  10. 비공개 $_create_table = '';
  11. 공개 함수 __construct($host = '', $user = '', $ pass = '', $db = '', $port = 3306) {
  12. if (empty($host) ||empty($user)) {
  13. } else {
  14. $this ->real_connect($host, $user, $pass, $db, $port);
  15. }
  16. }
  17. public function init() {
  18. return $this;
  19. }
  20. /**
  21. * 데이터베이스에 연결
  22. */
  23. 공개 함수 real_connect($host, $user, $pass, $db = '', $port = 3306) {
  24. $this- >_db = mysql_connect($host . ':' . $port, $user, $pass);
  25. if ($db) {
  26. $this->select_db($db);
  27. }
  28. return $this->init();
  29. }
  30. /**
  31. * 데이터베이스 선택
  32. */
  33. public function select_db($db) {
  34. if (mysql_select_db($ db, $this->_db)) {
  35. return true;
  36. }
  37. }
  38. /**
  39. * 쿼리문
  40. */
  41. 공용 함수 쿼리($sql) {
  42. if ($this->_db) {
  43. if ($this->_resource = mysql_query($sql, $this->_db)) {
  44. return $this->init( );
  45. }
  46. }
  47. throw new Exception($this->get_error());
  48. }
  49. /**
  50. * 결과 집합 가져오기
  51. */
  52. 공개 함수 fetch_array($arg = MYSQL_BOTH) {
  53. $result = array();
  54. if ($this->_resource && !mysql_errno($this->_db)) {
  55. while ($rs = mysql_fetch_array($this->_resource, $arg)) {
  56. $result[] = $rs;
  57. }
  58. }
  59. return $result;
  60. }
  61. /**
  62. * 오류 발생
  63. */
  64. public function get_error() {
  65. return mysql_errno($this->_db) . ": " . mysql_error($this->_db). "n";
  66. }
  67. /**
  68. * 데이터 테이블 표시
  69. */
  70. 공개 함수 show_tables($table = '') {
  71. $sql = "SHOW TABLES";
  72. $sql .= $테이블 ? " LIKE '{$table}'" : '';
  73. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  74. return $result;
  75. }
  76. /**
  77. * 데이터 테이블 필드 표시
  78. */
  79. public function show_columns($table) {
  80. if (empty($table)) {
  81. return array();
  82. }
  83. $sql = "{$table}의 전체 열 표시";
  84. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  85. return $result;
  86. }
  87. /**
  88. * 데이터 테이블 상태 표시
  89. */
  90. public function show_table_status($table) {
  91. if (empty($table)) {
  92. return array();
  93. }
  94. $result = $this->query("'{$table}'과 같은 테이블 상태 표시")->fetch_array(MYSQL_ASSOC);
  95. $result = 재설정($result);
  96. $result 반환 ;
  97. }
  98. /**
  99. * 데이터 테이블 구조 보기
  100. */
  101. 공개 함수 show_create_table($table) {
  102. if (empty($table)) {
  103. return '';
  104. }
  105. $this->_create_table = "존재하지 않는 경우 테이블 생성 `{$table}`(" . PHP_EOL;
  106. $table_status = $this->show_table_status($table);
  107. $columns = $this->show_columns($table);
  108. foreach ($columns AS $col) {
  109. $this->_create_table .= "`{$col['Field'] }` {$col['Type']} NOT NULL {$col['Extra']}," . PHP_EOL;
  110. }
  111. $this->_create_table .= $this->create_indexSyntax($table);
  112. $char = substr($table_status['Collation'], 0, strpos($table_status['Collation'], '_'));
  113. $table_status['Auto_increment'] = $table_status['Auto_increment'] ? $table_status['Auto_increment'] : 0;
  114. $this->_create_table .= ")Engine={$table_status['Engine']} AUTO_INCREMENT={$table_status['Auto_increment']} DEFAULT CHARSET={$ 숯};" . str_repeat(PHP_EOL, 3);
  115. return $this->_create_table;
  116. }
  117. /**
  118. * 트리거 표시
  119. */
  120. 공용 함수 show_constraint($db_name) {
  121. if (empty($db_name)) {
  122. return array();
  123. }
  124. $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";
  125. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  126. }
  127. /**
  128. * 색인 표시
  129. */
  130. 공개 함수 show_index($table) {
  131. if (empty($table)) {
  132. return array();
  133. }
  134. $sql = "{$table}에서 인덱스 표시";
  135. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  136. $result 반환;
  137. }
  138. /**
  139. * 데이터베이스 구조 표시
  140. */
  141. 공개 함수 show_database_char() {
  142. $sql = "'character_set_database'와 같은 변수 표시";
  143. $char = $this-> query($sql)->fetch_array(MYSQL_ASSOC);
  144. return Reset($char);
  145. }
  146. /**
  147. * 인덱스 구문 생성
  148. */
  149. 공용 함수 create_indexSyntax($table ) {
  150. if (empty($table)) {
  151. return array();
  152. }
  153. $indexing = $this->show_index($table);
  154. $syntax = 배열 ();
  155. $indexSyntax = array();
  156. foreach ($indexing을 $index로) {
  157. $syntax[$index['Index_type']][$index['Key_name']][] = $index['Column_name'];
  158. }
  159. foreach ($syntax as $index_type => $index_value) {
  160. foreach ($index_value as $key_name => $columns) {
  161. if ($key_name == 'PRIMARY') {
  162. $indexSyntax[] = 'PRIMARY KEY (`' . implode("`,`", $columns) . '`)';
  163. } else {
  164. if ($index_type == 'FULLTEXT') {
  165. $indexSyntax[] = "FULLTEXT KEY `{$key_name}` (`" . implode("`,`", $columns) . '`)';
  166. } else{
  167. $indexSyntax[] = "KEY `{$key_name}` USING {$index_type} (`" . implode("`,`", $columns) . '` )';
  168. }
  169. }
  170. }
  171. }
  172. return implode(',' . PHP_EOL, $indexSyntax) . PHP_EOL;
  173. }
  174. /**
  175. * 삽입 구문 생성
  176. */
  177. 공용 함수 create_insertSyntax($table) {
  178. if (empty($table)) {
  179. return '';
  180. }
  181. $sql = "SELECT * FROM {$table}";
  182. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  183. $insertStr = '';
  184. if ($result) {
  185. $first = 재설정($result);
  186. $key = implode('`,`', array_keys($first));
  187. $insert = "INSERT INTO `{$table}` (`{$key}`) VALUES ";
  188. $valuesStr = array();
  189. foreach ($result as $value) {
  190. $values ​​= array ();
  191. foreach ($value as $v) {
  192. $v = mysql_real_escape_string($v);
  193. $values[] = preg_replace("#\ #", "\", $v) ;
  194. }
  195. $valuesStr[] = "('" . implode("','", $values) . "')";
  196. }
  197. $valuesStr = array_chunk($valuesStr, 5000);
  198. foreach ($valuesStr as $str) {
  199. $insertStr .= $insert . implode(',', $str) . ';' . PHP_EOL;
  200. }
  201. }
  202. $insertStr을 반환합니다. str_repeat(PHP_EOL, 3);
  203. }
  204. }
  205. $export = '';
  206. $test = new MysqlExport('localhost', 'root', '', 'pm_cms');
  207. $char = $test->show_database_char();
  208. $test->query("SET NAMES {$char['Value']}");
  209. $tables = $test->show_tables();
  210. foreach ($tables as $table) {
  211. list($table_name) = array_values($table);
  212. $export .= $test->show_create_table ($table_name);
  213. $export .= $test->create_insertSyntax($table_name);
  214. }
  215. $fp = fopen('pm_cms.sql', 'w');
  216. fwrite ($fp, $export);
  217. fclose($fp);
  218. ?>
复代码


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿