首頁 >後端開發 >php教程 >MySQL的備份

MySQL的備份

WBOY
WBOY原創
2016-07-25 08:50:37772瀏覽
原本想著用SHOW CREATE TABLE ergodic 來做備份的但是發現如果Table 有 comment 而且還是亂碼的話,會導致SHOW CREATE TABLE 出來的腳本缺少一個符號。所以有了這個版本。
  1. class MysqlExport{
  2. /**
  3. * 資料庫連線
  4. */
  5. private $_db;
  6. /**
  7. * 建立表格結構sql
  8. */
  9. private $_create_table = '';
  10. public function __construct($host = '', $user = '', $ pass = '', $db = '', $port = 3306) {
  11. if (empty($host) ||empty($user)) {
  12. } else {
  13. $this - >real_connect($host, $user, $pass, $db, $port);
  14. }
  15. }
  16. public function init() {
  17. return $this;
  18. }
  19. /**
  20. * 連接資料庫
  21. */
  22. public function real_connect($host, $user, $pass, $db = '', $port = 3306) {
  23. $this- >_db = mysql_connect($host . ':' . $port, $user, $pass);
  24. if ($db) {
  25. $this->select_db($db);
  26. }
  27. return $this->init();
  28. }
  29. /**
  30. * 選擇資料庫
  31. */
  32. public function select_db($db) {
  33. if (mysql_select_db($ db, $this-this-this-this- >_db)) {
  34. return true;
  35. }
  36. }
  37. /**
  38. * 查詢語句
  39. */
  40. public function query($sql) {
  41. if ($ this->_db) {
  42. if ($this->_resource = mysql_query($sql, $this->_db)) {
  43. return $this->init( );
  44. }
  45. }
  46. 拋出新例外($this->get_error());
  47. }
  48. /**
  49. * 取得結果集
  50. */
  51. 公用函數fetch_array($arg = MYSQL_BOTH) {
  52. $result = array();
  53. if ($this->_resource && !mysql_errno($this->_db)) {
  54. while ($rs = mysql_fetch_array($this->_resource, $arg)) {
  55. $result[] = $rs;
  56. }
  57. }
  58. return $result;
  59. }
  60. /**
  61. * 取得錯誤
  62. */
  63. 公用函數get_error() {
  64. return mysql_errno($this->_db) 。 "n";
  65. }
  66. /**
  67. * 顯示資料表
  68. */
  69. public function show_tables($table = '') {
  70. $sql = "SHOW TABLES";
  71. $sql .= $表 ? " LIKE '{$table}'" : '';
  72. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  73. return $result;
  74. }
  75. /**
  76. * 顯示資料表欄位
  77. */
  78. public function show_columns($table) {
  79. if (empty($table)) {
  80. return array();
  81. }
  82. $sql = "顯示{$table} 中的完整欄位";
  83. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  84. return $result;
  85. }
  86. /**
  87. * 顯示資料表狀態
  88. */
  89. public function show_table_status($table) {
  90. if (empty($table)) {
  91. return array();
  92. }
  93. $result🎜 > $result🎜 > $result🎜 > $result🎜 > $result🎜 > $result🎜 > $result🎜 > $result🎜 > $result🎜 > $result = $this->query("SHOW TABLE STATUS LIKE '{$table}'")->fetch_array(MYSQL_ASSOC);
  94. $result = reset($result);
  95. return $result ;
  96. } }
  97. /**
  98. * 顯示資料表結構
  99. */
  100. public function show_create_table($table) {
  101. if (empty($table)) {
  102. return '';
  103. }
  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['Collat​​e'], 0, strpos($table_status['Collat​​ion'], '_'));
  113. $table_status['Auto_increment'] = $table_status[ '自動增量'] ? $table_status['Auto_increment'] : 0;
  114. $this->_create_table .= ")Engine={$table_status['Engine']} AUTO_INCRMENT={$table_status['Auto_increment']} 預設字元集={$字元};” str_repeat(PHP_EOL, 3);
  115. return $this->_create_table;
  116. }
  117. /**
  118. * 顯示觸發器
  119. */
  120. public function show_constraint($ 🎜> if (empty($db_name)) {
  121. return array();
  122. }
  123. $sql = "SELECT a.CONSTRAINT_NAME AS constrint_name, a.TABLE_name AS table_name, a.COLU .REFERENCED_TABLE_NAME 作為引用的表名稱、a.REFERENCED_COLUMN_作為引用的列名稱、b.UPDATE_RULE 作為更新規則、b.DELETE_RULE AS 刪除規則FROM information_schema.KEY_COLUMN_USAGE 為項目基金constraint_name E a.constraint_schema = ' {$db_name}' AND a.POSITION_IN_UNIQUE_CONSTRAINT = 1";
  124. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  125. }
  126. 🎜> /**
  127. * 顯示索引
  128. */
  129. public function show_index($table) {
  130. if (empty($table)) {
  131. return array();
  132. }
  133. $sql = "SHOW INDEX FROM {$table}";
  134. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  135. return $result;
  136. }
  137. /**
  138. * 顯示資料庫結構
  139. */
  140. public function show_database_char() {
  141. $sql = "顯示變數如'character_set_database'";
  142. $char = $this->; query($sql)->fetch_array(MYSQL_ASSOC);
  143. return reset($char);
  144. }
  145. /**
  146. * 建立索引語法
  147. */
  148. public function create_indexSyntax($table) {
  149. if (empty($table)) {
  150. return array();
  151. }
  152. $indexing = $this->show_index($table);
  153. $syntax = array () ;
  154. $indexSyntax = array();
  155. foreach ($indexing as $index) {
  156. $syntax[$index['Index_type']][$index['Key_name']][] = $ index['Column_name'];
  157. }
  158. foreach ($syntax as $index_type => $index_value) {
  159. foreach ($index_value as $key_name => $columns) {
  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}` (`" .內爆("`,`", $columns) 。 '`)' ;
  166. } else{
  167. $indexSyntax[] = "KEY `{$key_name}` 使用{$index_type} (`" . implode("`,`", $columns) . '` )';
  168. }
  169. }
  170. }
  171. }
  172. return implode(',' . PHP_EOL, $indexSyntax) 。 🎝>*/
  173. public function create_insertSyntax($table) {
  174. if (empty($table)) {
  175. return '';
  176. }
  177. $sql = "SELECT * FROM {$table}";
  178. $result = $this->query($sql)->fetch_array(MYSQL_ASSOC);
  179. $insertStr = '' ;
  180. if ($result) {
  181. $first = reset($result);
  182. $key = implode('`,`', array_keys($first));
  183. $insert = " INSERT INTO `{$table}` (`{$key}`) VALUES ";
  184. $valuesStr = array();
  185. foreach ($result as $value) {
  186. $values = array () ;
  187. foreach ($value as $v) {
  188. $v = mysql_real_escape_string($v);
  189. $values[] = preg_replace("#\ #", "\", $v) ;
  190. }
  191. $valuesStr[] = "('" .implode("','", $values) . "')";
  192. }
  193. $valuesStr = array_chunk($valuesStr, 5000) ;
  194. foreach ($valuesStr as $str) {
  195. $insertStr .= $insert .內爆(',', $str) 。 PHP_EOL;
  196. }
  197. }
  198. 回傳 $insertStr 。
  199. $test = new MysqlExport('localhost', 'root', '', 'pm_cms');
  200. $char = $test->show_database_char();
  201. $test->query("設定名稱{$char['Value']}");
  202. $tables = $test->show_tables();
  203. foreach ($tables as $table) {
  204. list($table_name) = array_values ( $table);
  205. $export .= $test->show_create_table ($table_name);
  206. $export .= $test->create_insertSyntax($table_name);
  207. }
  208. $fp = fopenopen ( 'pm_cms.sql', 'w');
  209. fwrite ($fp, $export);
  210. fclose($fp);
  211. ?>
  212. 複製程式碼
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn