当前位置: 首页 > 面试题库 >

为什么我的数据库备份脚本无法在php中使用?

拓拔坚
2023-03-14
问题内容

我正在使用David Walsh(html" target="_blank">http://davidwalsh.name/backup-mysql-database-
php
)的数据库备份脚本将MYSQL数据库作为.sql文件备份到服务器。

我创建了一个名为backup的用户,并为其赋予了所有特权(只是为了确保)。然后,我将代码放入php文件中,并设置cron作业以运行php文件。

这是代码:

/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{

    $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);
    }

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

        $return.= 'DROP TABLE '.$table.';';
        $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
        $return.= "\n\n".$row2[1].";\n\n";

        for ($i = 0; $i < $num_fields; $i++) 
        {
            while($row = mysql_fetch_row($result))
            {
                $return.= 'INSERT INTO '.$table.' VALUES(';
                for($j=0; $j<$num_fields; $j++) 
                {
                    $row[$j] = addslashes($row[$j]);
                    $row[$j] = ereg_replace("\n","\\n",$row[$j]);
                    if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
                    if ($j<($num_fields-1)) { $return.= ','; }
                }
                $return.= ");\n";
            }
        }
        $return.="\n\n\n";
    }

    //save file
    $handle = fopen('../backup/db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
    fwrite($handle,$return);
    fclose($handle);
}

backup_tables('localhost','alupto_backup','pass','*');

在执行cron作业时,备份无法正常工作,并且我收到一封电子邮件,其中显示了以下错误:

警告* :mysql_fetch_row():提供的参数 在第 18 行的
/home5/ideapale/public_html/amatorders_basic/admin/backup.php中
不是有效的MySQL结果资源
*

第18行是以下代码:

while($row = mysql_fetch_row($result))

当我在phpMyAdmin中运行SQL(SHOW
TABLES)时,它工作正常,并向我显示了所有表的列表。但是由于某种原因,当php文件尝试运行SQL时,我收到一个错误。

为什么我的数据库备份脚本不起作用?


问题答案:

除非您的数据库只是一个玩具数据库(相当于“ hello world”脚本),否则这将无法以SQL脚本备份数据库。

该脚本令人震惊。您不应该使用它来备份数据库。该脚本之前已发布:PHP数据库转储脚本-
有问题吗?

  • 在mysql_connect()或mysql_queries()之后没有错误检查。您可能只是输入了错误的密码或其他密码,但您永远不会知道,因为脚本无法验证连接是否成功。

  • 如果您的数据库包含任何NULL,它将不会产生正确的INSERT语句。

  • 不处理字符集。

  • addlashes()不适合转义数据。

  • 表名没有定界。

  • 不备份视图,过程,功能或触发器。

  • mysql_query()缓冲结果,因此,如果您的表包含数千行或更多行,则将超出PHP内存限制。实际上,该脚本将一系列INSERT语句串联到单个PHP变量中。因此,在完成之前,您将在内存中表示 整个 数据库。

没有人应该使用该脚本。 这完全是垃圾,我不能轻易地说出来。

只需使用shellexec()运行mysqldump。

@ÁlvaroG. Vicario很好,您甚至不需要使用PHP即可完成此任务。我以为您需要从PHP脚本进行备份。这是我从cron脚本创建备份的方法:

创建一个shell脚本,可以随意调用它,例如mymysqldump.sh。这是我的写法:

:
: ${BACKUP_HOST:="localhost"}
: ${BACKUP_DATABASE:="mydatabase"}
: ${BACKUP_DIR:="/opt/local/var/db/mysql5/backups"}
: ${BACKUP_FILE:="${DATABASE}-`date +%Y%m%d%H%M%S`"}

mysqldump -h ${BACKUP_HOST} ${BACKUP_DATABASE} > ${BACKUP_DIR}/${BACKUP_FILE}

当然,根据您的环境需要自定义变量的值。

您可能会注意到用户名和密码 不在 此文件中。请不要将密码以纯文本形式输入脚本中,这样每个人都可以阅读它们。相反,我们将它们放在选项文件中以使其更安全。

创建一个特殊的操作系统用户,该用户将要从cron运行备份。您的系统可能有一个特殊的用户“ mysql”或“ _mysql”来运行MySQL
Server,但是该用户可能配置为没有有效的主目录。您需要一个具有主目录的用户。我们称之为“ mybackup”。

在该用户的主目录下,创建一个.my.cnf包含以下内容的文件:

[mysqldump]
user = alupto_backup
password = xyzzy

其中“ alupto_backup”和“
xyzzy”是MySQL用户名及其密码(请针对您的环境进行更改)。设置此文件的所有权和模式,以便只有其所有者才能读取它:

chown mybackup .my.cnf
chmod 600 .my.cnf

在该用户的主目录下创建一个bin目录,并将我们的shell脚本放入其中。

mkdir ~mybackup/bin
mv mymysqldump ~mybackup/bin

现在,您可以运行shell脚本进行测试:

sh ~mybackup/bin/mymysqldump

现在为该用户创建一个cron文件:

crontab -u mybackup

@daily ~mybackup/bin/mymysqldump

应该是这样。



 类似资料:
  • 任何数据库都需要备份,备份数据是维护数据库必不可少的操作。 在学习如何备份数据之前,我们先了解一下数据库备份是为了应对哪些场景?为什么数据库需要备份? 备份就是为了防止原数据丢失,保证数据的安全。当数据库因为某些原因造成部分或者全部数据丢失后,备份文件可以帮我们找回丢失的数据。因此,数据备份是很重要的工作。 常见数据库备份的应用场景如下。 数据丢失应用场景: 人为操作失误造成某些数据被误操作 软件

  • 问题内容: 我尝试了许多脚本来进行数据库备份,但是我做不到。我想每小时备份一次数据库。 我将文件添加到“ /etc/cron.hourly/”文件夹,将其chmod更改为755,但未运行。至少我写了我的伪代码。 如果您可以为此操作编写脚本并告诉我该怎么办,我将非常高兴。将这个脚本文件添加到文件夹之后。 获取当前日期并创建一个变量, 为文件名创建一个变量, 像这样获取我的数据库的转储 删除文件夹中所

  • 我尝试了很多数据库备份脚本,但都做不到。我想每小时备份一次数据库 我将文件添加到“/etc/cron.hourly/”文件夹,将其chmod更改为755,但没有运行。至少我写了我的伪代码。 如果你能为这次行动写一个脚本,告诉我应该做些什么,我会很高兴的?将此脚本文件添加到文件夹。 获取当前日期并创建一个变量, 为文件名创建一个变量, 像下面这样获取我的数据库转储文件

  • 问题内容: 我在MySql中有一个很大的数据库,我需要每天左右对其进行备份。 我需要能够从任何计算机上进行备份,因此我考虑制作一个php脚本来做到这一点,并将此php脚本置于联机状态(具有密码保护和授权等功能,因此只有我可以访问它)。 但是,我不知道如何正确完成? 我应该使用哪些命令,并且可以更改备份的设置(例如)? 我将不胜感激… 另外,如果这是一个错误的方法(不安全,或者使用错误的sql文件提

  • 本文向大家介绍shell 备份数据库、代码上线的脚本,包括了shell 备份数据库、代码上线的脚本的使用技巧和注意事项,需要的朋友参考一下 Shell 脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。 备份MySQL数据库

  • 我的表单已提交,但未存储在表中。如果我对请求执行dd(),则数据在中,但当我执行save()时,它不会按预期工作。我想在backoffice表单上添加用户,仅包含姓名、电子邮件、用户类型和密码。 编辑:我将问题图像更改为代码,以便您更容易理解,很抱歉第一次尝试。编辑2:现在出现了更多的两件事,密码验证确认总是错误的,如果我跳过验证,则会出现以下错误: 对未定义方法App\User::forget(