[DICA] Backup diário mysql para PHP7

Olá pessoal, com o PHP7 o mysql_query, etc foi descontinuado.

Segue uma sugestão de rotina para backup diário usando mysqli_query e PHP7

Eu controlo o backup diário por cookie, faço um cookie que expira em 24H e após isso fará novamente o backup.

basta colocar esse código em algum aplicação que tenha o banco mysql

if(!isset($_COOKIE['deletadia']))
{
	echo "<img src='../_lib/img/scriptcase__NM__ajax_load.gif'><br>Realizando backup de Segurança<br>";

	$patcB = "C:/SISTEMA/Backup/"; // coloque o local do backup
	
        //conexão atual do SC
	$host   = [sc_glo_server];
	$user   = [sc_glo_user];
	$pass   = sc_decode([sc_glo_pass]);
	$dbname = [sc_glo_db];
	
    $link = mysqli_connect($host,$user,$pass, $dbname);
	
	//Conexão ok?
	if (mysqli_connect_errno())
	{
		echo "Failed to connect to MySQL: " . mysqli_connect_error();
		exit;
	}

	mysqli_query($link, "SET NAMES 'utf8'");
	$tables = array();
	
		$tables = array();
		$result = mysqli_query($link, 'SHOW TABLES');
		while($row = mysqli_fetch_row($result))
		{
			if($row[0] != 'ncm' && $row[0] != 'genericos')
			{
				$tables[] = $row[0];
			}
		}
	
	$return = '';

	foreach($tables as $table)
	{
		$result = mysqli_query($link, 'SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$num_rows = mysqli_num_rows($result);

		$tableCli = $table;

		$return.= 'DROP TABLE IF EXISTS '.$tableCli.';';
		$row2 = mysqli_fetch_row(mysqli_query($link, 'SHOW CREATE TABLE '.$table));
		$return.= "\n\n".str_replace('CREATE TABLE `'.$table.'` ','CREATE TABLE `'.$tableCli.'` ',$row2[1]).";\n\n";
		$counter = 1;

		//tabelas
		for ($i = 0; $i < $num_fields; $i++) 
		{   //Linhas
			while($row = mysqli_fetch_row($result))
			{   
				if($counter == 1){
					$return.= 'INSERT INTO '.$tableCli.' VALUES(';
				} else{
					$return.= '(';
				}

				//campos
				for($j=0; $j<$num_fields; $j++) 
				{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}

				if($num_rows == $counter){
					$return.= ");\n";
				} else{
					$return.= "),\n";
				}
				++$counter;
			}
		}
		$return.=";\n\n\n";
	}


	//salvar arquivo
	$fileName = date("YmdHis").".sql";
	$fileComp = $patcB.$fileName;
	$handle = fopen($fileComp,'w+');
	fwrite($handle,$return);
	fclose($handle);

        //cookie que vai durar 24H e após isso fará backup novamente	
	setcookie("deletadia","ok",strtotime('+1 day'));
}

Muito legal, Rodrigo. Obrigado por compartilhar.

Legal por compartilhar.

Eu já uso o MySQL Dump no próprio shell com script, coloco no CRON do cPanel para executar de madrugada automaticamente, além
de fazer o backup com o dia da semana separado, depois ele verifica as bases e já otimiza, de madrugada é bom porque não
impacta no uso para o cliente, podendo ficar lento durante o backup.

O Kleyber também faz igualzinho.

E aí Jailton, também tenho essa mesma rotina, chamando por curl -s …

Essa acima que passei é bom para ter um backup que o cliente pode fazer quando quiser.

Somente para registro.
Para bancos pequenos o backup via php executa normal.
Para bancos maiores que 10 ou 20gb começa a aparecer problemas no backup.
Neste caso prefira o MysqlDump via shell ou cmd

Rodrigo, obrigado pela dica.
Aconteceu comigo a situação explanada pelo Alexandre. Tive que utilizar o MysqlDump, única maneira que encontrei para resolver um backup de uns 30MB com mysql.

No geral a utilização funciona, dependendo do tamanho do banco, precisará fazer algumas alterações no php.ini
[MySQLi] e ; Resource Limits ;

Também uma coisa importante que pode ser alterado é colocar addslashes pois se tiver aspas simples vai travar