2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +00:00

93_DbRep: dumpMySQL clientSide: add create database to dump file

git-svn-id: https://svn.fhem.de/fhem/trunk@28134 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2023-11-07 19:35:13 +00:00
parent 830b9aeb44
commit bd309cccfe
2 changed files with 555 additions and 477 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it. # Do not insert empty lines here, update check depends on it.
- change: 93_DbRep: dumpMySQL clientSide: add create database to dump file
- change: 93_DbRep: dumpMySQL clientSide: change dump file to stricter rights - change: 93_DbRep: dumpMySQL clientSide: change dump file to stricter rights
- bugfix: 47_OBIS: Implement "nohacks" attribute - bugfix: 47_OBIS: Implement "nohacks" attribute
- bugfix: 36_Shelly: undefinded values on restart - bugfix: 36_Shelly: undefinded values on restart

View File

@ -59,6 +59,7 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch';
# Version History intern # Version History intern
my %DbRep_vNotesIntern = ( my %DbRep_vNotesIntern = (
"8.52.13" => "07.11.2023 dumpMySQL clientSide: add create database to dump file ",
"8.52.12" => "05.11.2023 dumpMySQL clientSide: change the dump file to stricter rights ", "8.52.12" => "05.11.2023 dumpMySQL clientSide: change the dump file to stricter rights ",
"8.52.11" => "17.09.2023 improve the markout in func DbRep_checkValidTimeSequence, Forum:#134973 ", "8.52.11" => "17.09.2023 improve the markout in func DbRep_checkValidTimeSequence, Forum:#134973 ",
"8.52.10" => "09.07.2023 fix wrong SQL syntax for PostgreSQL -> DbRep_createSelectSql, Forum:#134170 ", "8.52.10" => "09.07.2023 fix wrong SQL syntax for PostgreSQL -> DbRep_createSelectSql, Forum:#134170 ",
@ -8249,10 +8250,7 @@ sub DbRep_mysql_DumpClientSide {
my $hash = $paref->{hash}; my $hash = $paref->{hash};
my $name = $paref->{name}; my $name = $paref->{name};
my $dbname = $hash->{DATABASE};
my $dump_path = AttrVal ($name, "dumpDirLocal", $dbrep_dump_path_def); my $dump_path = AttrVal ($name, "dumpDirLocal", $dbrep_dump_path_def);
$dump_path = $dump_path."/" unless($dump_path =~ m/\/$/);
my $optimize_tables_beforedump = AttrVal ($name, "optimizeTablesBeforeDump", 0); my $optimize_tables_beforedump = AttrVal ($name, "optimizeTablesBeforeDump", 0);
my $memory_limit = AttrVal ($name, "dumpMemlimit", 100000); my $memory_limit = AttrVal ($name, "dumpMemlimit", 100000);
my $my_comment = AttrVal ($name, "dumpComment", ""); my $my_comment = AttrVal ($name, "dumpComment", "");
@ -8261,16 +8259,13 @@ sub DbRep_mysql_DumpClientSide {
my $ead = AttrVal ($name, "executeAfterProc", undef); my $ead = AttrVal ($name, "executeAfterProc", undef);
my $mysql_commentstring = "-- "; my $mysql_commentstring = "-- ";
my $character_set = "utf8";
my $repver = $hash->{HELPER}{VERSION}; my $repver = $hash->{HELPER}{VERSION};
my $sql_text = ''; my $dbname = $hash->{DATABASE};
my $sql_file = ''; $dump_path = $dump_path."/" unless($dump_path =~ m/\/$/);
my $dbpraefix = "";
my ($sth,$tablename,$sql_create,$rct,$insert,$first_insert,$backupfile,$drc,$drh,$e, my ($sth,$tablename,$rct,$insert,$backupfile,$drc,$drh,$filesize,$totalrecords);
$sql_daten,$inhalt,$filesize,$totalrecords,$status_start,$status_end); my (@ar,@tablenames,@tables,@ctab);
my (@ar,@tablerecords,@tablenames,@tables,@ergebnis); my (%db_tables, %db_tables_views);
my (%db_tables);
my $bst = [gettimeofday]; # Background-Startzeit my $bst = [gettimeofday]; # Background-Startzeit
@ -8279,7 +8274,7 @@ sub DbRep_mysql_DumpClientSide {
##################### Beginn Dump ######################## ##################### Beginn Dump ########################
############################################################ ############################################################
undef(%db_tables); undef %db_tables;
# Startzeit ermitteln # Startzeit ermitteln
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time); my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
@ -8305,42 +8300,46 @@ sub DbRep_mysql_DumpClientSide {
my @mysql_version = $sth->fetchrow; my @mysql_version = $sth->fetchrow;
my @v = split(/\./,$mysql_version[0]); my @v = split(/\./,$mysql_version[0]);
my $collation = '';
my $dbcharset = '';
if ($v[0] >= 5 || ($v[0] >= 4 && $v[1] >= 1) ) { # mysql Version >= 4.1 if ($v[0] >= 5 || ($v[0] >= 4 && $v[1] >= 1) ) { # mysql Version >= 4.1
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, "SET NAMES '".$character_set."'"); # get standard encoding of MySQl-Server ($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, qq(SHOW VARIABLES LIKE 'collation_database'));
return "$name|$err" if ($err);
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, "SHOW VARIABLES LIKE 'character_set_connection'");
return "$name|$err" if($err); return "$name|$err" if($err);
@ar = $sth->fetchrow; @ar = $sth->fetchrow;
$character_set = $ar[1];
if ($ar[1]) {
$collation = $ar[1];
$dbcharset = (split '_', $collation, 2)[0];
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, qq(SET NAMES "$dbcharset" COLLATE "$collation"));
return "$name|$err" if($err);
}
} }
else { # mysql Version < 4.1 -> no SET NAMES available else { # mysql Version < 4.1 -> no SET NAMES available
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, "SHOW VARIABLES LIKE 'character_set'"); # get standard encoding of MySQl-Server ($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, "SHOW VARIABLES LIKE 'dbcharset'"); # get standard encoding of MySQl-Server
return "$name|$err" if($err); return "$name|$err" if($err);
@ar = $sth->fetchrow; @ar = $sth->fetchrow;
if (defined($ar[1])) { if ($ar[1]) {
$character_set = $ar[1]; $dbcharset = $ar[1];
} }
} }
Log3 ($name, 3, "DbRep $name - Characterset of collection set to $character_set. "); Log3 ($name, 3, "DbRep $name - Characterset of collection set to $dbcharset. ");
undef(@tables);
undef(@tablerecords);
my %db_tables_views;
my $t = 0; my $t = 0;
my $r = 0; my $r = 0;
my $st_e = "\n";
my $value = 0; my $value = 0;
my $engine = ''; my $engine = '';
my $dbpraefix = '';
my $query = "SHOW TABLE STATUS FROM `$dbname`"; # Eigenschaften der vorhandenen Tabellen ermitteln (SHOW TABLE STATUS -> Rows sind nicht exakt !!) my $query = "SHOW TABLE STATUS FROM `$dbname`"; # Eigenschaften der vorhandenen Tabellen ermitteln (SHOW TABLE STATUS -> Rows sind nicht exakt !!)
if ($dbpraefix ne "") { if ($dbpraefix ne "") {
$query .= " LIKE '$dbpraefix%'"; $query .= " LIKE '$dbpraefix%'";
Log3 ($name, 3, "DbRep $name - Searching for tables inside database $dbname with prefix $dbpraefix...."); Log3 ($name, 3, "DbRep $name - Searching for tables inside database $dbname with prefix $dbpraefix....");
} }
else { else {
@ -8351,7 +8350,7 @@ sub DbRep_mysql_DumpClientSide {
return "$name|$err" if($err); return "$name|$err" if($err);
while ( $value = $sth->fetchrow_hashref()) { while ( $value = $sth->fetchrow_hashref()) {
$value->{skip_data} = 0; #defaut -> backup data of table $value->{skip_data} = 0; # default -> backup data of table
Log3 ($name, 5, "DbRep $name - ......... Table definition found: ........."); Log3 ($name, 5, "DbRep $name - ......... Table definition found: .........");
@ -8426,7 +8425,7 @@ sub DbRep_mysql_DumpClientSide {
return $err if($err); return $err if($err);
} }
$st_e .= "-- TABLE-INFO\n"; # Tabelleneigenschaften für SQL-File ermitteln my $part = ''; # Tabelleneigenschaften für SQL-File ermitteln
for $tablename (@tablenames) { for $tablename (@tablenames) {
my $dump_table = 1; my $dump_table = 1;
@ -8437,24 +8436,28 @@ sub DbRep_mysql_DumpClientSide {
} }
} }
if ($dump_table == 1) { # how many rows if ($dump_table == 1) {
$sql_create = "SELECT count(*) FROM `$tablename`";
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, $sql_create); ($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, qq(SELECT count(*) FROM `$tablename`));
return "$name|$err" if($err); return "$name|$err" if($err);
$db_tables{$tablename}{Rows} = $sth->fetchrow; $db_tables{$tablename}{Rows} = $sth->fetchrow; # how many rows
$sth->finish; $sth->finish;
$r += $db_tables{$tablename}{Rows}; $r += $db_tables{$tablename}{Rows};
push(@tables,$db_tables{$tablename}{Name}); # add tablename to backuped tables push @tables, $db_tables{$tablename}{Name}; # add tablename to backuped tables
$t++; $t++;
if (!defined $db_tables{$tablename}{Update_time}) { if (!defined $db_tables{$tablename}{Update_time}) {
$db_tables{$tablename}{Update_time} = 0; $db_tables{$tablename}{Update_time} = 0;
} }
$st_e .= $mysql_commentstring."TABLE: $db_tables{$tablename}{Name} | Rows: $db_tables{$tablename}{Rows} | Length: ".($db_tables{$tablename}{Data_length}+$db_tables{$tablename}{Index_length})." | Engine: $db_tables{$tablename}{Engine}\n"; $part .= $mysql_commentstring;
$part .= "TABLE: $db_tables{$tablename}{Name} | ";
$part .= "Rows: $db_tables{$tablename}{Rows} | ";
$part .= "Length: ".($db_tables{$tablename}{Data_length} + $db_tables{$tablename}{Index_length})." | ";
$part .= "Engine: $db_tables{$tablename}{Engine}";
$part .= "\n";
if ($db_tables{$tablename}{Name} eq "current") { if ($db_tables{$tablename}{Name} eq "current") {
$drc = $db_tables{$tablename}{Rows}; $drc = $db_tables{$tablename}{Rows};
@ -8466,28 +8469,40 @@ sub DbRep_mysql_DumpClientSide {
} }
} }
$st_e .= "-- EOF TABLE-INFO"; $part .= $mysql_commentstring."EOF TABLE-INFO";
Log3 ($name, 3, "DbRep $name - Found ".(@tables)." tables with $r records."); Log3 ($name, 3, "DbRep $name - Found ".(@tables)." tables with $r records.");
# AUFBAU der Statuszeile in SQL-File: ## Headerzeilen aufbauen
# -- Status | tabellenzahl | datensaetze | Datenbankname | Kommentar | MySQLVersion | Charset | EXTINFO ##########################
# my $sql_text = $mysql_commentstring."DB Name: $dbname";
$status_start = $mysql_commentstring."Status | Tables: $t | Rows: $r "; $sql_text .= "\n";
$status_end = "| DB: $dbname | Comment: $my_comment | MySQL-Version: $mysql_version[0] "; $sql_text .= $mysql_commentstring."DB Character set: $dbcharset";
$status_end .= "| Charset: $character_set $st_e\n". $sql_text .= "\n";
$mysql_commentstring."Dump created on $CTIME_String by DbRep-Version $repver\n".$mysql_commentstring; $sql_text .= $mysql_commentstring."MySQL Version: $mysql_version[0]";
$sql_text .= "\n";
$sql_text .= $mysql_commentstring."Dump created on $CTIME_String by DbRep-Version $repver";
$sql_text .= "\n";
$sql_text .= $mysql_commentstring."Comment: $my_comment";
$sql_text .= "\n";
$sql_text .= $mysql_commentstring."TABLE-INFO";
$sql_text .= "\n";
$sql_text .= $mysql_commentstring."TABLES: $t, Rows: $r";
$sql_text .= "\n";
$sql_text .= $part;
$sql_text .= "\n\n";
$sql_text = $status_start.$status_end; ## neues SQL Ausgabefile mit Header anlegen
#############################################
my $sql_file = '';
# neues SQL-Ausgabefile anlegen ($err, $sql_file, $backupfile) = DbRep_NewDumpFilename ( { sql_text => $sql_text,
($err, $sql_text, $first_insert, $sql_file, $backupfile) = DbRep_NewDumpFilename ( { sql_text => $sql_text,
dump_path => $dump_path, dump_path => $dump_path,
dbname => $dbname, dbname => $dbname,
time_stamp => $time_stamp, time_stamp => $time_stamp
character_set => $character_set
} }
); );
if ($err) { if ($err) {
Log3 ($name, 2, "DbRep $name - $err"); Log3 ($name, 2, "DbRep $name - $err");
$err = encode_base64 ($err, ""); $err = encode_base64 ($err, "");
@ -8497,56 +8512,109 @@ sub DbRep_mysql_DumpClientSide {
Log3 ($name, 5, "DbRep $name - New dump file $sql_file was created"); Log3 ($name, 5, "DbRep $name - New dump file $sql_file was created");
} }
##################### jede einzelne Tabelle dumpen ######################## my $first_insert = 0;
## DB Einstellungen
#####################
$sql_text = "/*!40101 SET NAMES '".$dbcharset."' */;";
$sql_text .= "\n";
$sql_text .= "SET FOREIGN_KEY_CHECKS=0;";
$sql_text .= "\n\n";
DbRep_WriteToDumpFile ($sql_text, $sql_file);
## DB Create Statement einfügen
#################################
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, qq(SHOW CREATE DATABASE IF NOT EXISTS $dbname));
return "$name|$err" if($err);
my $db_create = $sth->fetchrow;
$sth->finish;
$sql_text = $mysql_commentstring;
$sql_text .= "\n";
$sql_text .= $mysql_commentstring;
$sql_text .= "Create database";
$sql_text .= "\n";
$sql_text .= $mysql_commentstring;
$sql_text .= "\n";
$sql_text .= $db_create.';';
$sql_text .= "\n";
$sql_text .= "USE `$dbname`;";
$sql_text .= "\n\n";
DbRep_WriteToDumpFile ($sql_text, $sql_file);
## jede einzelne Tabelle dumpen
#################################
$totalrecords = 0; $totalrecords = 0;
$sql_text = "";
for $tablename (@tables) { # first get CREATE TABLE Statement for $tablename (@tables) { # first get CREATE TABLE Statement
if ($dbpraefix eq "" || ($dbpraefix ne "" && substr($tablename, 0, length($dbpraefix)) eq $dbpraefix)) { if ($dbpraefix eq "" || ($dbpraefix ne "" && substr($tablename, 0, length($dbpraefix)) eq $dbpraefix)) {
Log3 ($name, 3, "DbRep $name - Dumping table $tablename (Type ".$db_tables{$tablename}{Engine}."):"); Log3 ($name, 3, "DbRep $name - Dumping table $tablename (Type ".$db_tables{$tablename}{Engine}."):");
$a = "\n\n$mysql_commentstring\n$mysql_commentstring"."Table structure for table `$tablename`\n$mysql_commentstring\n"; $part = $mysql_commentstring;
$part .= "\n";
$part .= $mysql_commentstring;
$part .= "Table structure of table `$tablename`";
$part .= "\n";
$part .= $mysql_commentstring;
$part .= "\n";
if ($db_tables{$tablename}{Engine} ne 'VIEW' ) { if ($db_tables{$tablename}{Engine} ne 'VIEW' ) {
$a .= "DROP TABLE IF EXISTS `$tablename`;\n"; $part .= "DROP TABLE IF EXISTS `$tablename`;";
} }
else { else {
$a .= "DROP VIEW IF EXISTS `$tablename`;\n"; $part .= "DROP VIEW IF EXISTS `$tablename`;";
} }
$sql_text .= $a; $sql_text .= $part;
$sql_create = "SHOW CREATE TABLE `$tablename`"; $sql_text .= "\n";
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, $sql_create); ($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, qq(SHOW CREATE TABLE `$tablename`));
return "$name|$err" if($err); return "$name|$err" if($err);
@ergebnis = $sth->fetchrow; @ctab = $sth->fetchrow;
$sth->finish; $sth->finish;
$a = $ergebnis[1].";\n";
if (length($a) < 10) { $part = $ctab[1].";";
$err = "Fatal error! Couldn't read CREATE-Statement of table `$tablename`! This backup might be incomplete! Check your database for errors. MySQL-Error: ".$DBI::errstr; $part .= "\n";
if (length($part) < 10) {
$err = "Fatal error! Couldn't read CREATE-Statement for table `$tablename`! This backup might be incomplete! Check your database for errors. MySQL-Error: ".$DBI::errstr;
Log3 ($name, 2, "DbRep $name - $err"); Log3 ($name, 2, "DbRep $name - $err");
return "$name|$err";
} }
else { else {
$sql_text .= $a; $sql_text .= $part;
Log3 ($name, 5, "DbRep $name - Create-SQL found:\n$a");
} }
Log3 ($name, 5, "DbRep $name - Create-SQL found:\n$part");
if ($db_tables{$tablename}{skip_data} == 0) { if ($db_tables{$tablename}{skip_data} == 0) {
$sql_text .= "\n$mysql_commentstring\n$mysql_commentstring"."Dumping data for table `$tablename`\n$mysql_commentstring\n"; $sql_text .= "\n";
$sql_text .= "$mysql_commentstring\n";
$sql_text .= "$mysql_commentstring";
$sql_text .= "Dumping data of table `$tablename`\n";
$sql_text .= "$mysql_commentstring\n";
$sql_text .= "/*!40000 ALTER TABLE `$tablename` DISABLE KEYS */;"; $sql_text .= "/*!40000 ALTER TABLE `$tablename` DISABLE KEYS */;";
DbRep_WriteToDumpFile ($sql_text, $sql_file); DbRep_WriteToDumpFile ($sql_text, $sql_file);
$sql_text = ""; $sql_text = "";
$fieldlist = "("; ($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, qq(SHOW FIELDS FROM `$tablename`));
$sql_create = "SHOW FIELDS FROM `$tablename`"; # build fieldlist
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, $sql_create);
return "$name|$err" if($err); return "$name|$err" if($err);
while (@ar = $sth->fetchrow) { $fieldlist = "(";
while (@ar = $sth->fetchrow) { # build fieldlist
$fieldlist .= "`".$ar[0]."`,"; $fieldlist .= "`".$ar[0]."`,";
} }
@ -8564,25 +8632,25 @@ sub DbRep_mysql_DumpClientSide {
$insert = "INSERT INTO `$tablename` $fieldlist VALUES ("; # default beginning for INSERT-String $insert = "INSERT INTO `$tablename` $fieldlist VALUES ("; # default beginning for INSERT-String
$first_insert = 0; $first_insert = 0;
$sql_daten = "SELECT * FROM `$tablename` LIMIT ".$ttt.",".$dumpspeed.";"; # get rows (parts) my $sql_daten = "SELECT * FROM `$tablename` LIMIT ".$ttt.",".$dumpspeed.";"; # get rows (parts)
($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, $sql_daten); ($err, $sth) = DbRep_prepareExecuteQuery ($name, $dbh, $sql_daten);
return "$name|$err" if($err); return "$name|$err" if($err);
while ( @ar = $sth->fetchrow) { # Start the insert while ( @ar = $sth->fetchrow) { # Start the insert
if ($first_insert == 0) { if ($first_insert == 0) {
$a = "\n$insert"; $part = "\n$insert";
} }
else { else {
$a = "\n("; $part = "\n(";
} }
for $inhalt(@ar) { # quote all values for my $cont (@ar) { # quote all values
$a .= $dbh->quote($inhalt).","; $part .= $dbh->quote($cont).",";
} }
$a = substr($a,0, length($a)-1).");"; # remove trailing ',' and add end-sql $part = substr ($part, 0, length($part)-1).");"; # remove trailing ',' and add end-sql
$sql_text .= $a; $sql_text .= $part;
if ($memory_limit > 0 && length($sql_text) > $memory_limit) { if ($memory_limit > 0 && length($sql_text) > $memory_limit) {
($err, $filesize) = DbRep_WriteToDumpFile ($sql_text, $sql_file); ($err, $filesize) = DbRep_WriteToDumpFile ($sql_text, $sql_file);
@ -8590,12 +8658,15 @@ sub DbRep_mysql_DumpClientSide {
$sql_text = ""; $sql_text = "";
} }
} }
$sth->finish; $sth->finish;
} }
$sql_text .= "\n/*!40000 ALTER TABLE `$tablename` ENABLE KEYS */;\n"; $sql_text .= "\n/*!40000 ALTER TABLE `$tablename` ENABLE KEYS */;\n";
} }
($err, $filesize) = DbRep_WriteToDumpFile ($sql_text, $sql_file); # write sql commands to file ($err, $filesize) = DbRep_WriteToDumpFile ($sql_text, $sql_file); # write sql commands to file
$sql_text = ""; $sql_text = "";
if ($db_tables{$tablename}{skip_data} == 0) { if ($db_tables{$tablename}{skip_data} == 0) {
@ -8609,16 +8680,17 @@ sub DbRep_mysql_DumpClientSide {
} }
# end # end
DbRep_WriteToDumpFile("\nSET FOREIGN_KEY_CHECKS=1;\n", $sql_file); DbRep_WriteToDumpFile("\nSET FOREIGN_KEY_CHECKS=1;\n", $sql_file);
($err, $filesize) = DbRep_WriteToDumpFile ($mysql_commentstring."EOB\n", $sql_file); ($err, $filesize) = DbRep_WriteToDumpFile ($mysql_commentstring."EOB\n", $sql_file);
# Datenbankverbindung schliessen
$sth->finish(); $sth->finish();
$dbh->disconnect(); $dbh->disconnect();
my $rt = tv_interval($st); # SQL-Laufzeit ermitteln my $rt = tv_interval($st); # SQL-Laufzeit ermitteln
my $compress = AttrVal ($name, "dumpCompress", 0); # Dumpfile komprimieren wenn dumpCompress=1 my $compress = AttrVal ($name, "dumpCompress", 0); # Dumpfile komprimieren wenn dumpCompress=1
if ($compress) { if ($compress) {
($err, $backupfile, $filesize) = DbRep_dumpCompress ($hash, $backupfile); ($err, $backupfile, $filesize) = DbRep_dumpCompress ($hash, $backupfile);
} }
@ -9214,6 +9286,7 @@ sub DbRep_mysql_RestoreClientSide {
if ($bfile =~ m/.*.gzip$/) { # Dumpfile dekomprimieren wenn gzip if ($bfile =~ m/.*.gzip$/) { # Dumpfile dekomprimieren wenn gzip
($err,$bfile) = DbRep_dumpUnCompress($hash,$bfile); ($err,$bfile) = DbRep_dumpUnCompress($hash,$bfile);
if ($err) { if ($err) {
$err = encode_base64($err,""); $err = encode_base64($err,"");
$dbh->disconnect; $dbh->disconnect;
@ -9242,7 +9315,7 @@ sub DbRep_mysql_RestoreClientSide {
while (<FH>) { while (<FH>) {
$tmp = $_; $tmp = $_;
chomp($tmp); chomp $tmp;
if (!$tmp || substr($tmp, 0, 2) eq "--") { if (!$tmp || substr($tmp, 0, 2) eq "--") {
next; next;
@ -9252,17 +9325,21 @@ sub DbRep_mysql_RestoreClientSide {
if (substr($line,-1) eq ";") { if (substr($line,-1) eq ";") {
if ($line !~ /^INSERT INTO.*$/) { if ($line !~ /^INSERT INTO.*$/) {
Log3 ($name, 4, "DbRep $name - do query: $line");
eval { $dbh->do($line); eval { $dbh->do($line);
}; }
if ($@) { or do {
$e = $@; $e = $@;
$err = encode_base64($e,""); $err = encode_base64($e,"");
Log3 ($name, 1, "DbRep $name - last query: $line");
Log3 ($name, 1, "DbRep $name - $e");
close(FH); close(FH);
$dbh->disconnect; $dbh->disconnect;
Log3 ($name, 1, "DbRep $name - last query: $line");
Log3 ($name, 1, "DbRep $name - $e");
return "$name|$err"; return "$name|$err";
} };
$line = ''; $line = '';
next; next;
@ -9297,16 +9374,18 @@ sub DbRep_mysql_RestoreClientSide {
$query = $query.";"; $query = $query.";";
eval { $dbh->do($query); eval { $dbh->do($query);
}; }
if ($@) { or do {
$e = $@; $e = $@;
$err = encode_base64($e,""); $err = encode_base64($e,"");
Log3 ($name, 1, "DbRep $name - last query: $query");
Log3 ($name, 1, "DbRep $name - $e");
close(FH); close(FH);
$dbh->disconnect; $dbh->disconnect;
Log3 ($name, 1, "DbRep $name - last query: $query");
Log3 ($name, 1, "DbRep $name - $e");
return "$name|$err"; return "$name|$err";
} };
$i = 0; $i = 0;
$line =~ /INSERT INTO (.*) VALUES \((.*)\);/; $line =~ /INSERT INTO (.*) VALUES \((.*)\);/;
@ -9323,17 +9402,20 @@ sub DbRep_mysql_RestoreClientSide {
if (length($query) >= $i_max) { if (length($query) >= $i_max) {
$query = $query.";"; $query = $query.";";
eval { $dbh->do($query); eval { $dbh->do($query);
}; }
if ($@) { or do {
$e = $@; $e = $@;
$err = encode_base64($e,""); $err = encode_base64($e,"");
Log3 ($name, 1, "DbRep $name - last query: $query");
Log3 ($name, 1, "DbRep $name - $e");
close(FH); close(FH);
$dbh->disconnect; $dbh->disconnect;
Log3 ($name, 1, "DbRep $name - last query: $query");
Log3 ($name, 1, "DbRep $name - $e");
return "$name|$err"; return "$name|$err";
} };
$i = 0; $i = 0;
$query = ''; $query = '';
@ -9345,16 +9427,18 @@ sub DbRep_mysql_RestoreClientSide {
} }
eval { $dbh->do($query) if($i); eval { $dbh->do($query) if($i);
}; }
if ($@) { or do {
$e = $@; $e = $@;
$err = encode_base64($e,""); $err = encode_base64($e,"");
Log3 ($name, 1, "DbRep $name - last query: $query");
Log3 ($name, 1, "DbRep $name - $e");
close(FH); close(FH);
$dbh->disconnect; $dbh->disconnect;
Log3 ($name, 1, "DbRep $name - last query: $query");
Log3 ($name, 1, "DbRep $name - $e");
return "$name|$err"; return "$name|$err";
} };
$dbh->disconnect; $dbh->disconnect;
close(FH); close(FH);
@ -12691,24 +12775,17 @@ sub DbRep_NewDumpFilename {
my $dump_path = $paref->{dump_path}; my $dump_path = $paref->{dump_path};
my $dbname = $paref->{dbname}; my $dbname = $paref->{dbname};
my $time_stamp = $paref->{time_stamp}; my $time_stamp = $paref->{time_stamp};
my $character_set = $paref->{character_set};
my $part = ""; my $part = "";
my $sql_file = $dump_path.$dbname."_".$time_stamp.$part.".sql"; my $sql_file = $dump_path.$dbname."_".$time_stamp.$part.".sql";
my $backupfile = $dbname."_".$time_stamp.$part.".sql"; my $backupfile = $dbname."_".$time_stamp.$part.".sql";
$sql_text .= "/*!40101 SET NAMES '".$character_set."' */;\n";
$sql_text .= "SET FOREIGN_KEY_CHECKS=0;\n";
my ($err, $filesize) = DbRep_WriteToDumpFile ($sql_text, $sql_file); my ($err, $filesize) = DbRep_WriteToDumpFile ($sql_text, $sql_file);
return $err if($err); return $err if($err);
chmod (0664, $sql_file); chmod (0664, $sql_file);
$sql_text = ""; return ($err, $sql_file, $backupfile);
my $first_insert = 0;
return ($err, $sql_text, $first_insert, $sql_file, $backupfile);
} }
#################################################################################################### ####################################################################################################