2013-01-12 30 views
0

我无法管理备份我的MySQL数据库。我用下面的命令:mysqldump是不是倾销任何表

mysqldump --user=user --password=password db > db.sql 

这是输出文件的样子:

-- MySQL dump 10.11 
-- 
-- Host: localhost Database: db 
-- ------------------------------------------------------ 
-- Server version 5.0.96-community 

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 

就是这样。没有任何CREATE TABLE,也没有任何INSERT ...我也注意到在类似问题的帖子中,在输出结束处总是有一个-- Dump completed on YYYY-MM-DD HH:MM:SS,这里不是这种情况。我的用户名和密码是正确的,并且用户拥有所有可能的权限。

我在做什么错?

+0

如果使用'root'用户尝试它,它会工作吗? – tadman

+0

你可以在做一个mysql修复后尝试'mysqldump'。例如:'mysqlcheck --auto-repair db_name' – Suku

+0

使用过的用户有什么特权? – Lars

回答

1

由于提出这个问题,我的虚拟主机停用了shell_exec()命令,所以现在我使用PHP脚本来备份我的数据库。下面是我使用的功能:

function backup_tables($host, $user, $pass, $name, $tables='*', $backup_path) { 
    $link = mysql_connect($host,$user,$pass); 
    mysql_select_db($name,$link); 

    //get all of the tables 
    if($tables == '*') { 
     $tables = array(); 
     $result = mysql_query('SHOW TABLES'); 

     while($row = mysql_fetch_row($result)) { 
      $tables[] = $row[0]; 
     } 
    } 
    else { 
     $tables = is_array($tables) ? $tables : explode(', ',$tables); 
    } 

    $droptables = 'DROP TABLE IF EXISTS '; 

    for ($i = sizeof($tables) - 1; $i >= 0; $i--) { 
     $droptables .= '`' . $tables[$i] . '`'; 
     if ($i > 0) { 
      $droptables .= ', '; 
     } else { 
      $droptables .= ';'; 
     } 
    } 

    //cycle through 
    foreach($tables as $table) { 
     $result = mysql_query('SELECT * FROM '.$table); 
     $num_fields = mysql_num_fields($result); 

     // $droptables.= '`' . $table . '`, '; 
     $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table)); 
     $data .= "\n\n".$row2[1].";\n\n"; 

     for ($i = 0; $i < $num_fields; $i++) { 
      while($row = mysql_fetch_row($result)) { 
       $data .= 'INSERT INTO '.$table.' VALUES('; 

       for ($j = 0; $j < $num_fields; $j++) { 
        if (isset($row[$j])) { 
         $row[$j] = addslashes($row[$j]); 
         $row[$j] = ereg_replace("\n","\\n",$row[$j]); 
         $data .= '"'.$row[$j].'"' ; 
        } else { 
         $data .= 'NULL'; 
        } 

        if ($j < ($num_fields-1)) { 
         $data .= ','; 
        } 
       } 

       $data .= ");\n"; 
      } 
     } 

     $data .= "\n\n\n"; 
    } 

    $return = $droptables . $return; 

    //save file 
    $date = date('Ymd-His'); 
    $filename = 'db-backup-' . $date . '.sql'; 
    $handle = fopen($backup_path.$filename,'w+'); 
    fwrite($handle, utf8_encode($return)); 
    fclose($handle); 

    $gzfile = $filename . '.gz'; 
    $handle = gzopen($backup_path.$gzfile, 'w9'); 
    gzwrite($handle, file_get_contents($backup_path.$filename)); 
    gzclose($handle); 
} 

用法示例:backup_tables('localhost','user','pass','database', 'users, posts, comments, subscriptions', '/home/user/db_backups/');。你只需要记住把外键的表放在列表的最后。

1

尝试相同,但与正常mysql命令,也就是说,如果你有

mysqldump --user=root --password=secret db 

然后尝试

mysql --user=root --password=secret db 

你应该能够看到所有的表格和数据的方式,如果你'不是这可能是用户错了。

+0

我尝试了'mysql'命令,但我甚至不确定它的工作原理。只运行'mysql'而没有任何参数不会给我任何输出,这对我来说似乎很奇怪。另外,我必须通过PHP脚本运行所有这些命令,因为我的主机拒绝了我的请求来启用我的帐户的shell访问权限......任何想法? – PLPeeters

+0

如何在没有shell访问权限的情况下运行mysqldump? –

+0

通过带'shell_exec()'的PHP脚本。我的意思是说我没有远程shell访问。 – PLPeeters

2

试试这个:

mysqldump -u username -p DB_Name > dumpfile.sql 

它应该工作。

+0

我想它确实应该,但是自从问这个问题我的主机已经停用了'shell_exec()'命令,所以我现在使用PHP脚本来备份我的数据库。我会在一分钟后发布脚本。 – PLPeeters

-1

试试这个MySQL的ü根 - P DB_NAME < mydb.sql

-1

这为我工作。请尝试一次

mysql -u <username> -p"<password>" database_name < sqlfile.sql 
+0

您提供的命令是用于导入的,所以它根本不回答问题。 – PLPeeters