Dear Group: I have been doing a lot of experimenting with a rather huge database, and I need to recover from mistakes when necessary. I need to make live copies.
After spending too long trying unsuccessfully to load DBD::mysql and DBI.pm on my machine (for mysqlhotcopy), and and wasting a lot of time recreating indexes, and a lot of disk space & time using BACKUP, I finally wrote a little shell script to simply copy a large table and indexes from one database to another. It works. 70 lines. I used the hotcopy code as a guide. It's particularly good when you want to copy a huge database before doing a potentially damaging operation like ALTER TABLE to it. My database is already 2G data and 2G index, so I don't have time to fiddle with backup to text. This solution is optimized for big tables. It doesn't require Perl. Other major advantages of this script over backup or mysqlhotcopy include: 1. Creates the new database and table if necessary (but won't overwrite them) +. Puts the copied table into a [possibly new] database and checks it's valid. 2. Simple as hell, 70 lines, at least as fast as hotcopy. 3. No options: Usage line sufficient. 4. Doesn't need perl or DBI or DBD::mysql installed to work 5. Keeps the INDEXES intact (for large tables this is *important*) 6. Hotcopy safe, works with mysqld running, uses LOCK and FLUSH same as hotcopy. 7. Tells you what it's doing, and what the problems are, in English. "How do I copy a table?" is a FAQ, I hope this is a simple answer. The others never worked too well for me. Of course it's a first cut, and I'm not a shell script expert. The if/fi syntax is quite ugly and there's probably a better idiom. There's very little checking or flexibility. Corrections welcome. Steve ---------------------------------------cut here------------------ #!/bin/bash # copytable olddb newdb table # (c) Steve Rapaport, 2002. # Use as desired, keep the credits intact. set -x fromdb=$1 todb=$2 table=$3 #=================================== dbdir="/var/lib/mysql/" topath="${dbdir}${todb}/" frompath="${dbdir}${fromdb}/" if [ ! -f $frompath$table.MYD ] ; then echo "source table ($table.MYD) not found"; echo "Usage: $0 fromdb todb table" exit 1 fi if [ -f "${topath}${table}.MYD" ] ; then echo "Please delete destination table files $table.* first"; echo "Won't overwrite" exit 1 fi mysql -e "create database $todb;" if ! mysql -e "use $todb" ; then echo "Can't use or create database $todb" exit 1 fi mysql -e "use $fromdb; LOCK TABLES $table READ; FLUSH TABLES; FLUSH LOGS;" if ! mysqldump -d --add-drop-table $fromdb $table > "$table.sql" ; then echo "schema dump failed"; exit 1 fi if ! mysql -e "use ${todb}; source ${table}.sql;" ; then echo "schema copy failed"; exit 1 fi if ! cp ${frompath}${table}.MYI ${topath}${table}.MYI ; then echo "index copy failed"; exit 1 fi if ! cp ${frompath}${table}.MYD ${topath}${table}.MYD ; then echo "data copy failed"; exit 1 fi if ! cp ${frompath}${table}.frm ${topath}${table}.frm ; then echo ".frm copy failed"; exit 1 fi mysql -e "use $fromdb; UNLOCK TABLES;" echo "Done. Checking the new table." if ! mysql -e "use $todb; check table $table;" ; then echo "table check failed"; exit 1 fi exit 0 -- Steve Rapaport still at large --------------------------------------------------------------------- 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