Umstellen autoincrement nach Transport einer DB

MySQL, PostgreSQL, SQLite
sir tom
Posts: 70
Joined: 2003-01-07 09:42

Umstellen autoincrement nach Transport einer DB

Post by sir tom » 2006-01-26 09:03

Huhu,

ich bringe aktuell für eine Ligaseite deren Datenbanken auf einem anderen Server unter, problematisch dabei ist, das das Quellsystem mySQL 4.1.14 und das Zielsystem 4.0.21 als Version hat.

Mit der Option --compatible-mysql40 kann ich die DBs recht zügig transportieren, allerdings fehlen nach dem Transport die "auto increment" Settings in die ganzen Tabellen.

Folge: man muß "auto increment" nachträglich überall hinterlegen, was bei >130 Tabellen ne gute Arbeit ist.

Gibt es eine Möglichkeit diese Settings irgendwie mitzutransportieren? Ich habe keine (offentsichtliche) Möglichkeit gefunden (man mysql und man mysqldump durchgesehen).

metrax
RSAC
Posts: 232
Joined: 2003-02-22 22:51
Location: München / Berg-am-Laim

Re: Umstellen autoincrement nach Transport einer DB

Post by metrax » 2006-01-26 10:10

verrat und halt mal den kompletten mysqldump befehl, evt. liegt dein fehler ja in einer der anderen optionen.

sir tom
Posts: 70
Joined: 2003-01-07 09:42

Re: Umstellen autoincrement nach Transport einer DB

Post by sir tom » 2006-01-26 10:12

mysqldump -uwebx -p123456 --compatible-mysql40 databaseX > backup.sql

So sieht mein Dump-Befehl aus... Zurückspielen mach ich so:

mysql -uwebY -p654321 databaseY < backup.sql

User avatar
isotopp
RSAC
Posts: 482
Joined: 2003-08-21 10:21
Location: Berlin

Re: Umstellen autoincrement nach Transport einer DB

Post by isotopp » 2006-01-26 20:07

Sir Tom wrote:Gibt es eine Möglichkeit diese Settings irgendwie mitzutransportieren? Ich habe keine (offentsichtliche) Möglichkeit gefunden (man mysql und man mysqldump durchgesehen).
In MySQL 5.0 geht es mit information_schema ganz leicht:

Code: Select all

root@localhost [sps]> use information_schema
Database changed
root@localhost [information_schema]> select concat("alter table ", table_name, " auto_increment = ", auto_increment) as command from tables where table_schema = "sps";
+---------------------------------------+
| command                               |
+---------------------------------------+
| alter table detail auto_increment = 6 |
| alter table users auto_increment = 4  |
+---------------------------------------+
2 rows in set (0.00 sec)
und das führtst Du dann aus. In MySQL 4.1 und älter gibt es information_schema nicht. Also mußt Du Dir ein kleines Perlscript selber hacken und auf "SHOW TABLE STATUS" vertrauen.

Code: Select all

kris@linux:/tmp> cat probe.pl
#! /usr/bin/perl -w

use DBI;

my $database = "sps";

my $dsn = "DBI:mysql:database=$database;host=127.0.0.1;port=3333";
my $dbh = DBI->connect($dsn, "root");

my $cmd = "show table status";
my $stmt = $dbh->prepare($cmd);
$stmt->execute();

while (my $res = $stmt->fetchrow_hashref) {
   my %row = %$res;

   my $table = $row{"Name"};
   my $count = $row{"Auto_increment"};

   print "alter table $table auto_increment = $countn";
}
kris@linux:/tmp> ./probe.pl
alter table detail auto_increment = 6
alter table users auto_increment = 4
Der Grad der Offensichtlichkeit variiert zugegeben mit dem Blicwinkel des Betrachters. :)