Hi,
There is an easier way to duplicate a database; from the comand
line, you can run:
mysqladmin create db2
mysqldump db1 | mysql db2
If you want to duplicate the schema only (without the data):
mysqladmin create db2
mysqldump --no-data db1 | mysql db2
(You may have to add host/user/password options but I just wanted to
show the idea).
Hope this helps,
Joseph Bueno
Daevid Vincent wrote:
> Seems to me there should be a built in SQL command to duplicate a
> database. Jeepers. Or to read in a .sql file from PHP and create a
> database out of it (which was the original intent).
>
> Anyways, here's a 'hack'. I'd still love to hear anyone else's more
> elegant solution.
>
> $V2DB = "V2_SL".$CompanyID;
>
> $result = mysql_create_db($V2DB, $linkI);
> if (!$result) $errorstring .= "Error creating ".$V2DB."
> database<BR>\n".mysql_errno($linkI).": ".mysql_error($linkI)."<BR>\n";
>
> mysql_select_db ($V2DB, $linkI) or die ("Could not select ".$V2DB."
> Database");
> /*
> //TODO: None of these below here work. Ugh! so frustrating!!
> //$filename = "/mypath/todb/V2_DB.sql";
> //$fd = fopen ($filename, "r");
> //$sql = fread ($fd, filesize ($filename));
> //fclose ($fd);
>
> //$lines = file($filename);
> //foreach ($lines as $line_num => $line) { $sql .= $line; }
>
> //$sqlTables = explode(";",$sql);
> //foreach ($sqlTables as $table)
> //{
> // echo "<PRE>$table</PRE><p><hr>\n";
> // $result = mysql_query($sql,$linkI);
> // if (!$result) $errorstring .= "Error creating ".$V2DB."
> ".$table." table<BR>\n".mysql_errno($linkI).":
> ".mysql_error($linkI)."<BR>\n";
> //}
> */
>
> //You must have already created the "V2_Template" database.
> //This will make a clone of it, including data.
>
> $tableResult = mysql_list_tables ("V2_Template");
> while ($row = mysql_fetch_row($tableResult))
> {
> $tsql = "CREATE TABLE ".$V2DB.".".$row[0]." AS SELECT * FROM
> V2_Template.".$row[0];
> echo $tsql."<BR>\n";
> $tresult = mysql_query($tsql,$linkI);
> if (!$tresult) $errorstring .= "Error creating
> ".$V2DB.".".$row[0]." table<BR>\n".mysql_errno($linkI).":
> ".mysql_error($linkI)."<BR>\n";
> }
>
>
>
>>-----Original Message-----
>>From: Daevid Vincent [mailto:[EMAIL PROTECTED]]
>>Sent: Tuesday, December 17, 2002 1:16 AM
>>To: [EMAIL PROTECTED]
>>Cc: 'Bill Lovett'
>>Subject: RE: How can I duplicate a mysql template database?
>>
>>
>>Thanks for the reply Bill, however this did not solve the problem. I
>>still receive the same error with your method as well.
>>
>>1064: You have an error in your SQL syntax near ';
>>CREATE TABLE Departments (
>> DeptID int(10) unsigned NOT NULL auto_increment,' at line 4
>>
>>
>>>Are you first creating a new database first with mysql_create_db()
>>>before trying to run your schema? What error message do you
>>
>>get? The
>>
>>>code you've posted is only creating a table.
>>
>>Yes. I am:
>>
>>$V2DB = "V2_SL".$CompanyID;
>>$result = mysql_create_db($V2DB, $linkI);
>>mysql_select_db ($V2DB, $linkI) or die ("Could not select ".$V2DB."
>>Database");
>>
>>
>>>Also, rather than opening and reading in an external file or
>>>doing all
>>>those $sql .= lines, you might have an easier time using
>>>heredoc syntax,
>>>which would let you do something like
>>>
>>>$sql = <<<SQL
>>>CREATE TABLE IP_Dept (
>>> IP_Addr int(10) unsigned NOT NULL default
>>> DeptID int(10) unsigned NOT NULL default
>>>
>>> ...etc
>>>
>>>SQL;
>>>
>>>$result = mysql_query($sql,$linkI);
>>
>>Thanks for that tip, however it fails the same as opening the file and
>>same as "$sql .="
>>
>>
>>>(hopefully $linkI is your mysql connection) This way you
>>>don't have to bother with all that quoting.
>>
>>Yes, $linkI is my connection identifier.
>>
>>I just have an awful feeling that PHP/mySQL won't let me
>>stack commands
>>like that because if I just do one table, like this:
>>
>>$sql = <<<SQL
>>CREATE TABLE Schedule (
>> ScheduleID int(10) unsigned NOT NULL auto_increment,
>> TargetRange char(255) default NULL,
>> ScannerID int(10) unsigned NOT NULL default '0',
>> RunEvery char(50) default NULL,
>> NextRun datetime default NULL,
>> LastRun datetime default NULL,
>> PRIMARY KEY (ScheduleID)
>>) TYPE=MyISAM;
>>SQL;
>>
>>It "works". However I'm dreading doing this one table at a time. Grr.
>>
>>
>>>Daevid Vincent wrote:
>>>
>>>>I need to use PHP to duplicate the schema of a mysql
>>
>>database. This
>>
>>>>seems like it should be a simple task -- taking a
>>
>>'template' db and
>>
>>>>cloning it with a new name.
>>>>
>>>>I've tried things like:
>>>>
>>>> $filename = "myDB.sql";
>>>> $fd = fopen ($filename, "r");
>>>> $sql = fread ($fd, filesize ($filename));
>>>> fclose ($fd);
>>>>
>>>>And
>>>>
>>>> $lines = file($filename);
>>>> foreach ($lines as $line_num => $line) { $sql .= $line;
>>>>}
>>>>
>>>>And
>>>> $sql .= "CREATE TABLE IP_Dept (";
>>>> $sql .= " IP_Addr int(10) unsigned NOT NULL default
>>>>'0',";
>>>> $sql .= " DeptID int(10) unsigned NOT NULL default
>>>>'0'";
>>>> $sql .= ");";
>>>>
>>>> $sql .= "CREATE TABLE ResolveTable (";
>>>> $sql .= " IP_Addr int(10) unsigned NOT NULL default
>>>>'0',";
>>>> $sql .= " Name char(255) NOT NULL default '',";
>>>> $sql .= " Custom char(1) default NULL,";
>>>> $sql .= " Global char(1) default 'Y',";
>>>> $sql .= " OSVersion char(255) default NULL,";
>>>> $sql .= " RowID int(10) unsigned NOT NULL
>>>>auto_increment,";
>>>> $sql .= " Display enum('Yes','No') NOT NULL default
>>>>'Yes',";
>>>> $sql .= " PRIMARY KEY (RowID)";
>>>> $sql .= ");";
>>>>
>>>> echo "<PRE>".$sql."</PRE><P>";
>>>> $result = mysql_query($sql,$linkI);
>>>>
>>>>But ALL of them fail! Ugh!!! Can I not stack commands
>>
>>like that? Is
>>
>>>>there some way to read in a .sql file via PHP? The problem
>>>
>>>is that my
>>>
>>>>web pages are on a web server and the db is on a mysql
>>>
>>>server which are
>>>
>>>>different machines, so calling a system() or other execute style
>>>>function won't work for me.
>>>>
>>>>I figured, "Ah! Why don't I just make a template db on the
>>>
>>>server and
>>>
>>>>issue some SQL command to 'clone' that and rename it".
>>>
>>>You'd think that
>>>
>>>>was pretty straight forward, but I can't find any examples
>>>
>>>or commands
>>>
>>>>to do this seemingly trivial task. Ideas?
>>>>
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php