summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorunknown <monty@narttu.mysql.fi>2003-05-19 16:35:49 +0300
committerunknown <monty@narttu.mysql.fi>2003-05-19 16:35:49 +0300
commitdaac922bc306847581b9acee4bcf0a31707d72e7 (patch)
tree6025913cf3d482ba0783bf3420f7341c10cd574a /scripts
parent7c189b0dcf26ad8e408b8eaa7d69dbbe913ba421 (diff)
parent68aa31f268660db07b634f021716ecb872e19679 (diff)
downloadmariadb-git-daac922bc306847581b9acee4bcf0a31707d72e7.tar.gz
Merge with 4.0.13
BitKeeper/etc/ignore: auto-union BitKeeper/etc/logging_ok: auto-union BUILD/SETUP.sh: Auto merged BitKeeper/deleted/.del-libmysql.def~29fc6d70335f1c4c: Auto merged Makefile.am: Auto merged acinclude.m4: Auto merged BitKeeper/triggers/post-commit: Auto merged Build-tools/Do-compile: Auto merged VC++Files/libmysql/libmysql.dsp: Auto merged VC++Files/mysql.dsw: Auto merged client/mysql.cc: Auto merged client/mysqlbinlog.cc: Auto merged client/mysqldump.c: Auto merged include/config-win.h: Auto merged include/my_base.h: Auto merged include/my_global.h: Auto merged include/my_pthread.h: Auto merged include/my_sys.h: Auto merged include/violite.h: Auto merged innobase/buf/buf0flu.c: Auto merged innobase/buf/buf0lru.c: Auto merged innobase/include/buf0buf.h: Auto merged innobase/include/buf0lru.h: Auto merged innobase/include/row0mysql.h: Auto merged innobase/include/srv0srv.h: Auto merged innobase/lock/lock0lock.c: Auto merged innobase/log/log0log.c: Auto merged innobase/log/log0recv.c: Auto merged innobase/os/os0file.c: Auto merged innobase/row/row0mysql.c: Auto merged innobase/row/row0sel.c: Auto merged innobase/srv/srv0srv.c: Auto merged innobase/srv/srv0start.c: Auto merged innobase/trx/trx0sys.c: Auto merged innobase/trx/trx0trx.c: Auto merged innobase/ut/ut0ut.c: Auto merged myisam/ft_boolean_search.c: Auto merged myisam/mi_check.c: Auto merged myisam/mi_key.c: Auto merged myisam/mi_open.c: Auto merged myisam/mi_range.c: Auto merged myisam/mi_search.c: Auto merged myisam/sort.c: Auto merged mysql-test/r/delete.result: Auto merged mysql-test/r/fulltext.result: Auto merged mysql-test/r/innodb_handler.result: Auto merged mysql-test/r/join.result: Auto merged mysql-test/r/join_outer.result: Auto merged mysql-test/r/key.result: Auto merged mysql-test/r/multi_update.result: Auto merged mysql-test/r/myisam.result: Auto merged mysql-test/r/query_cache.result: Auto merged mysql-test/r/select.result: Auto merged mysql-test/r/variables.result: Auto merged mysql-test/t/alter_table.test: Auto merged mysql-test/t/ctype_latin1_de.test: Auto merged mysql-test/t/delete.test: Auto merged mysql-test/t/fulltext.test: Auto merged mysql-test/t/innodb_handler.test: Auto merged mysql-test/t/join.test: Auto merged mysql-test/t/join_outer.test: Auto merged mysql-test/t/key.test: Auto merged mysql-test/t/multi_update.test: Auto merged mysql-test/t/myisam.test: Auto merged mysql-test/t/query_cache.test: Auto merged mysql-test/t/repair.test: Auto merged mysql-test/t/select_safe.test: Auto merged mysql-test/t/type_decimal.test: Auto merged mysql-test/t/variables.test: Auto merged mysys/default.c: Auto merged mysys/my_pthread.c: Auto merged scripts/mysql_fix_privilege_tables.sh: Auto merged scripts/mysqld_safe.sh: Auto merged sql/ha_heap.h: Auto merged sql/ha_innodb.h: Auto merged sql/ha_myisam.cc: Auto merged sql/handler.cc: Auto merged sql/handler.h: Auto merged sql/init.cc: Auto merged sql/item.cc: Auto merged sql/item_create.cc: Auto merged sql/item_strfunc.cc: Auto merged sql/item_sum.cc: Auto merged sql/mini_client.cc: Auto merged sql/net_serv.cc: Auto merged sql/opt_range.cc: Auto merged sql/records.cc: Auto merged sql/slave.cc: Auto merged sql/sql_acl.h: Auto merged sql/sql_analyse.cc: Auto merged sql/sql_class.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_list.h: Auto merged sql/sql_load.cc: Auto merged sql/share/czech/errmsg.txt: Auto merged sql/share/danish/errmsg.txt: Auto merged sql/share/dutch/errmsg.txt: Auto merged sql/share/english/errmsg.txt: Auto merged sql/share/estonian/errmsg.txt: Auto merged sql/share/french/errmsg.txt: Auto merged sql/share/greek/errmsg.txt: Auto merged sql/share/hungarian/errmsg.txt: Auto merged sql/share/italian/errmsg.txt: Auto merged sql/share/japanese/errmsg.txt: Auto merged sql/share/korean/errmsg.txt: Auto merged sql/share/norwegian-ny/errmsg.txt: Auto merged sql/share/norwegian/errmsg.txt: Auto merged sql/share/portuguese/errmsg.txt: Auto merged sql/share/romanian/errmsg.txt: Auto merged sql/share/russian/errmsg.txt: Auto merged sql/share/slovak/errmsg.txt: Auto merged sql/share/spanish/errmsg.txt: Auto merged sql/share/swedish/errmsg.txt: Auto merged sql/share/ukrainian/errmsg.txt: Auto merged sql/unireg.h: Auto merged sql-bench/crash-me.sh: Auto merged sql-bench/test-transactions.sh: Auto merged strings/ctype-tis620.c: Auto merged tests/grant.res: Auto merged sql/log_event.cc: Merge with 4.0.13 Cleaned up comment syntax
Diffstat (limited to 'scripts')
-rw-r--r--scripts/mysql_fix_privilege_tables.sh24
-rw-r--r--scripts/mysql_install_db.sh5
-rw-r--r--scripts/mysql_setpermission.sh233
-rw-r--r--scripts/mysqld_safe.sh2
-rw-r--r--scripts/mysqlhotcopy.sh36
5 files changed, 157 insertions, 143 deletions
diff --git a/scripts/mysql_fix_privilege_tables.sh b/scripts/mysql_fix_privilege_tables.sh
index 83ee5023b89..05d6f3ffb71 100644
--- a/scripts/mysql_fix_privilege_tables.sh
+++ b/scripts/mysql_fix_privilege_tables.sh
@@ -1,14 +1,5 @@
#!/bin/sh
-echo "This scripts updates the mysql.user, mysql.db, mysql.host and the"
-echo "mysql.func tables to MySQL 3.22.14 and above."
-echo ""
-echo "This is needed if you want to use the new GRANT functions,"
-echo "CREATE AGGREGATE FUNCTION or want to use the more secure passwords in 3.23"
-echo ""
-echo "If you get 'Access denied' errors, you should run this script again"
-echo "and give the MySQL root user password as an argument!"
-
root_password="$1"
host="localhost"
user="root"
@@ -20,6 +11,21 @@ else
cmd="@bindir@/mysql -f --user=$user --password=$root_password --host=$host mysql"
fi
+# Debian addition
+if [ "$1" = "--sql-only" ]; then
+ root_password=""
+ cmd="/usr/share/mysql/echo_stderr"
+fi
+
+echo "This scripts updates the mysql.user, mysql.db, mysql.host and the"
+echo "mysql.func tables to MySQL 3.22.14 and above."
+echo ""
+echo "This is needed if you want to use the new GRANT functions,"
+echo "CREATE AGGREGATE FUNCTION or want to use the more secure passwords in 3.23"
+echo ""
+echo "If you get 'Access denied' errors, you should run this script again"
+echo "and give the MySQL root user password as an argument!"
+
echo "Converting all privilege tables to MyISAM format"
$cmd <<END_OF_DATA
ALTER TABLE user type=MyISAM;
diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh
index 1a969895f7f..b5048054832 100644
--- a/scripts/mysql_install_db.sh
+++ b/scripts/mysql_install_db.sh
@@ -147,7 +147,8 @@ then
resolved=`$bindir/resolveip localhost 2>&1`
if [ $? -eq 0 ]
then
- echo "Sorry, the host '$hostname' could not be looked up."
+ echo "Neither host '$hostname' and 'localhost' could not be looked up with"
+ echo "$bindir/resolveip"
echo "Please configure the 'hostname' command to return a correct hostname."
echo "If you want to solve this at a later stage, restart this script with"
echo "the --force option"
@@ -164,14 +165,12 @@ fi
# Create database directories mysql & test
if test "$in_rpm" -eq 0 || "$windows" -eq 0
-then
if test ! -d $ldata; then mkdir $ldata; chmod 700 $ldata ; fi
if test ! -d $ldata/mysql; then mkdir $ldata/mysql; chmod 700 $ldata/mysql ; fi
if test ! -d $ldata/test; then mkdir $ldata/test; chmod 700 $ldata/test ; fi
if test -w / -a ! -z "$user"; then
chown $user $ldata $ldata/mysql $ldata/test;
fi
-fi
# Initialize variables
c_d="" i_d=""
diff --git a/scripts/mysql_setpermission.sh b/scripts/mysql_setpermission.sh
index 43bf8a14c06..9699cd28047 100644
--- a/scripts/mysql_setpermission.sh
+++ b/scripts/mysql_setpermission.sh
@@ -16,20 +16,25 @@
## 1.2 begin screen now in a loop + quit is using 0 instead of 9
## after ideas of Paul DuBois.
## 1.2a Add Grant, References, Index and Alter privilege handling (Monty)
+## 1.3 Applied patch provided by Martin Mokrejs <mmokrejs@natur.cuni.cz>
+## (General code cleanup, use the GRANT statement instead of updating
+## the privilege tables directly, added option to revoke privileges)
#### TODO
#
# empty ... suggestions ... mail them to me ...
-$version="1.2";
+$version="1.3";
use DBI;
use Getopt::Long;
use strict;
-use vars qw($dbh $hostname $opt_user $opt_password $opt_help $opt_host
+use vars qw($dbh $sth $hostname $opt_user $opt_password $opt_help $opt_host
$opt_socket $opt_port $host $version);
+my $sqlhost = "";
+my $user = "";
$dbh=$host=$opt_user= $opt_password= $opt_help= $opt_host= $opt_socket= "";
$opt_port=0;
@@ -42,11 +47,11 @@ usage() if ($opt_help); # the help function
if ($opt_host eq '')
{
- $hostname = "localhost";
+ $sqlhost = "localhost";
}
else
{
- $hostname = $opt_host;
+ $sqlhost = $opt_host;
}
# ask for a password if no password is set already
@@ -62,7 +67,7 @@ if ($opt_password eq '')
# make the connection to MySQL
-$dbh= DBI->connect("DBI:mysql:mysql:host=$hostname:port=$opt_port:mysql_socket=$opt_socket",$opt_user,$opt_password, {PrintError => 0}) ||
+$dbh= DBI->connect("DBI:mysql:mysql:host=$sqlhost:port=$opt_port:mysql_socket=$opt_socket",$opt_user,$opt_password, {PrintError => 0}) ||
die("Can't make a connection to the mysql server.\n The error: $DBI::errstr");
# the start of the program
@@ -86,27 +91,44 @@ sub q1 { # first question ...
print "#"x70;
print "\n";
print "What would you like to do:\n";
- print " 1. Set password for a user.\n";
- print " 2. Add a database + user privilege for that database.\n";
- print " - user can do all except all admin functions\n";
- print " 3. Add user privilege for an existing database.\n";
- print " - user can do all except all admin functions\n";
- print " 4. Add user privilege for an existing database.\n";
- print " - user can do all except all admin functions + no create/drop\n";
- print " 5. Add user privilege for an existing database.\n";
- print " - user can do only selects (no update/delete/insert etc.)\n";
+ print " 1. Set password for an existing user.\n";
+ print " 2. Create a database + user privilege for that database\n";
+ print " and host combination (user can only do SELECT)\n";
+ print " 3. Create/append user privilege for an existing database\n";
+ print " and host combination (user can only do SELECT)\n";
+ print " 4. Create/append broader user privileges for an existing\n";
+ print " database and host combination\n";
+ print " (user can do SELECT,INSERT,UPDATE,DELETE)\n";
+ print " 5. Create/append quite extended user privileges for an\n";
+ print " existing database and host combination (user can do\n";
+ print " SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,\n";
+ print " LOCK TABLES,CREATE TEMPORARY TABLES)\n";
+ print " 6. Create/append database administrative privileges for an\n";
+ print " existing database and host combination (user can do\n";
+ print " SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,\n";
+ print " CREATE TEMPORARY TABLES,SHOW DATABASES,PROCESS)\n";
+ print " 7. Create/append full privileges for an existing database\n";
+ print " and host combination (user has FULL privilege)\n";
+ print " 8. Remove all privileges for for an existing database and\n";
+ print " host combination.\n";
+ print " (user will have all permission fields set to N)\n";
print " 0. exit this program\n";
- print "\nMake your choice [1,2,3,4,5,0]: ";
+ print "\nMake your choice [1,2,3,4,5,6,7,0]: ";
while (<STDIN>) {
$answer = $_;
chomp($answer);
- if ($answer =~ /1|2|3|4|5|0/) {
- &setpwd if ($answer == 1);
- &addall($answer) if ($answer =~ /^[2345]$/);
- if ($answer == 0) {
- print "Sorry, hope we can help you next time \n\n";
+ if ($answer =~ /^[12345678]$/) {
+ if ($answer == 1) {
+ setpwd();
+ } elsif ($answer =~ /^[2345678]$/) {
+ addall($answer);
+ } else {
+ print "Sorry, something went wrong. With such option number you should not get here.\n\n";
$end = 1;
}
+ } elsif ($answer == 0) {
+ print "We hope we can help you next time \n\n";
+ $end = 1;
} else {
print "Your answer was $answer\n";
print "and that's wrong .... Try again\n";
@@ -121,7 +143,7 @@ sub q1 { # first question ...
###
sub setpwd
{
- my ($user,$pass,$host);
+ my ($user,$pass,$host) = "";
print "\n\nSetting a (new) password for a user.\n";
$user = user();
@@ -168,22 +190,18 @@ sub setpwd
###
# all things which will be added are done here
###
-sub addall
-{
+sub addall {
my ($todo) = @_;
my ($answer,$good,$db,$user,$pass,$host,$priv);
- if ($todo == 2)
- {
+ if ($todo == 2) {
$db = newdatabase();
- }
- else
- {
+ } else {
$db = database();
}
$user = newuser();
- $pass = newpass();
+ $pass = newpass("$user");
$host = newhosts();
print "#"x70;
@@ -198,104 +216,80 @@ sub addall
print "Are you pretty sure you would like to implement this [yes/no]: ";
my $no = <STDIN>;
chomp($no);
- if ($no =~ /n/i)
- {
+ if ($no =~ /n/i) {
print "Okay .. that was it then ... See ya\n\n";
return(0);
- }
- else
- {
+ } else {
print "Okay ... let's go then ...\n\n";
}
- if ($todo == 2)
- {
+ if ($todo == 2) {
# create the database
- my $sth = $dbh->do("create database $db") || $dbh->errstr;
- }
-
- # select the privilege ....
- if (($todo == 2) || ($todo == 3))
- {
- $priv = "'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'";
+ if ($db) {
+ my $sth = $dbh->do("CREATE DATABASE $db") || $dbh->errstr;
+ } else {
+ print STDERR "What do you want? You wanted to create new database and add new user, right?\n";
+ die "But then specify databasename, please\n";
}
- elsif ($todo == 4)
- {
- $priv = "'Y','Y','Y','Y','N','N','N','Y','Y','Y'";
}
- elsif ($todo == 5)
- {
- $priv = "'Y','N','N','N','N','N','N','N','N','N'";
- }
- else
- {
- print "Sorry, choice number $todo isn't known inside the program .. See ya\n";
+
+ if ( ( !$todo ) or not ( $todo =~ m/^[2-8]$/ ) ) {
+ print STDERR "Sorry, select option $todo isn't known inside the program .. See ya\n";
quit();
}
my @hosts = split(/,/,$host);
- $user = $dbh->quote($user);
- $db = $dbh->quote($db);
- if ($pass eq '')
- {
- $pass = "''";
+ if (!$user) {
+ die "username not specified: $user\n";
}
- else
- {
- $pass = "PASSWORD(". $dbh->quote($pass) . ")";
+ if (!$db) {
+ die "databasename is not specified nor *\n";
}
- foreach my $key (@hosts)
- {
- my $key1 = $dbh->quote($key);
- my $sth = $dbh->prepare("select Host,User from user where Host = $key1 and User = $user") || die $dbh->errstr;
- $sth->execute || die $dbh->errstr;
- my @r = $sth->fetchrow_array;
- if ($r[0])
- {
- print "WARNING WARNING SKIPPING CREATE FOR USER $user AND HOST $key\n";
- print "Reason: entry already exists in the user table.\n";
+ foreach $host (@hosts) {
+ # user privileges: SELECT
+ if (($todo == 2) || ($todo == 3)) {
+ $sth = $dbh->do("GRANT SELECT ON $db.* TO $user@\"$host\" IDENTIFIED BY \'$pass\'") || die $dbh->errstr;
+ } elsif ($todo == 4) {
+ # user privileges: SELECT,INSERT,UPDATE,DELETE
+ $sth = $dbh->do("GRANT SELECT,INSERT,UPDATE,DELETE ON $db.* TO $user@\"$host\" IDENTIFIED BY \'$pass\'") || die $dbh->errstr;
+ } elsif ($todo == 5) {
+ # user privileges: SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES
+ $sth = $dbh->do("GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES ON $db.* TO $user@\"$host\" IDENTIFIED BY \'$pass\'") || die $dbh->errstr;
+ } elsif ($todo == 6) {
+ # admin privileges: GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES,SHOW DATABASES,PROCESS
+ $sth = $dbh->do("GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES,SHOW DATABASES,PROCESS ON $db.* TO $user@\"$host\" IDENTIFIED BY \'$pass\'") || die $dbh->errstr;
+ } elsif ($todo == 7) {
+ # all privileges
+ $sth = $dbh->do("GRANT ALL ON $db.* TO \'$user\'\@\'$host\' IDENTIFIED BY \'$pass\'") || die $dbh->errstr;
+ } elsif ($todo == 8) {
+ # all privileges set to N
+ $sth = $dbh->do("REVOKE ALL ON *.* FROM \'$user\'\@\'$host\'") || die $dbh->errstr;
}
- else
- {
- $sth = $dbh->prepare("insert into user (Host,User,Password) values($key1,$user,$pass)") || die $dbh->errstr;
- $sth->execute || die $dbh->errstr;
- $sth->finish;
}
- $sth = $dbh->prepare("INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv,References_priv,Index_priv,Alter_priv) VALUES ($key1,$db,$user,$priv)") || die $dbh->errstr;
- $sth->execute || die $dbh->errstr;
- $sth->finish;
- }
- $dbh->do("flush privileges") || print "Can't load privileges\n";
+ $dbh->do("FLUSH PRIVILEGES") || print STDERR "Can't flush privileges\n";
print "Everything is inserted and mysql privileges have been reloaded.\n\n";
}
###
# ask for a new database name
###
-sub newdatabase
-{
+sub newdatabase {
my ($answer,$good,$db);
print "\n\nWhich database would you like to add: ";
- while (<STDIN>)
- {
+ while (<STDIN>) {
$answer = $_;
$good = 0;
chomp($answer);
- if ($answer)
- {
- my $sth = $dbh->prepare("show databases") || die $dbh->errstr;
+ if ($answer) {
+ my $sth = $dbh->prepare("SHOW DATABASES") || die $dbh->errstr;
$sth->execute || die $dbh->errstr;
- while (my @r = $sth->fetchrow_array)
- {
- if ($r[0] eq $answer)
- {
+ while (my @r = $sth->fetchrow_array) {
+ if ($r[0] eq $answer) {
print "\n\nSorry, this database name is already in use; try something else: ";
$good = 1;
}
}
- }
- else
- {
+ } else {
print "You must type something ...\nTry again: ";
next;
}
@@ -309,48 +303,44 @@ sub newdatabase
###
# select a database
###
-sub database
-{
+sub database {
my ($answer,$good,$db);
- print "\n\nWhich database would you like to select: \n";
+ print "\n\nWhich database from existing databases would you like to select: \n";
print "You can choose from: \n";
my $sth = $dbh->prepare("show databases") || die $dbh->errstr;
$sth->execute || die $dbh->errstr;
- while (my @r = $sth->fetchrow_array)
- {
+ while (my @r = $sth->fetchrow_array) {
print " - $r[0] \n";
}
- print "Which database will it be (case sensitive): ";
- while (<STDIN>)
- {
+ print "Which database will it be (case sensitive). Type * for any: \n";
+ while (<STDIN>) {
$answer = $_;
$good = 0;
chomp($answer);
- if ($answer)
- {
+ if ($answer) {
+ if ($answer eq "*") {
+ print "OK, the user entry will NOT be limited to any database";
+ return("*");
+ }
my $sth = $dbh->prepare("show databases") || die $dbh->errstr;
$sth->execute || die $dbh->errstr;
- while (my @r = $sth->fetchrow_array)
- {
- if ($r[0] eq $answer)
- {
+ while (my @r = $sth->fetchrow_array) {
+ if ($r[0] eq $answer) {
$good = 1;
$db = $r[0];
last;
}
}
- }
- else
- {
- print "You must type something ...\nTry again: ";
+ } else {
+ print "Type either database name or * meaning any databasename. That means";
+ print " any of those above but also any which will be created in future!";
+ print " This option gives a user chance to operate on databse mysql, which";
+ print " contains privilege settings. That is really risky!\n";
next;
}
- if ($good == 1)
- {
+ if ($good == 1) {
last;
- }
- else
- {
+ } else {
print "You must select one from the list.\nTry again: ";
next;
}
@@ -364,7 +354,8 @@ sub database
###
sub newuser
{
- my ($answer,$user);
+ my $user = "";
+ my $answer = "";
print "\nWhat username is to be created: ";
while(<STDIN>)
@@ -430,7 +421,7 @@ sub user
sub newpass
{
my ($user) = @_;
- my ($answer,$good,$pass,$yes);
+ my ($pass,$answer,$good,$yes);
print "Would you like to set a password for $user [y/n]: ";
$yes = <STDIN>;
@@ -487,7 +478,7 @@ sub newpass
###
sub newhosts
{
- my ($answer,$good,$host);
+ my ($host,$answer,$good);
print "We now need to know from what host(s) the user will connect.\n";
print "Keep in mind that % means 'from any host' ...\n";
diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh
index 094b1fbfcd3..e400c27b84c 100644
--- a/scripts/mysqld_safe.sh
+++ b/scripts/mysqld_safe.sh
@@ -224,7 +224,7 @@ then
if test -n "$open_files"
then
ulimit -n $open_files
- args="open-files-limit=$open_files $args"
+ args="--open-files-limit=$open_files $args"
fi
if test -n "$core_file_size"
then
diff --git a/scripts/mysqlhotcopy.sh b/scripts/mysqlhotcopy.sh
index ec76aa479f3..a89a8919752 100644
--- a/scripts/mysqlhotcopy.sh
+++ b/scripts/mysqlhotcopy.sh
@@ -55,7 +55,8 @@ Usage: $0 db_name[./table_regex/] [new_db_name | directory]
-P, --port=# port to use when connecting to local server with TCP/IP
-S, --socket=# socket to use when connecting to local server
- --allowold don\'t abort if target already exists (rename it _old)
+ --allowold don\'t abort if target dir already exists (rename it _old)
+ --addtodest don\'t rename target dir if it exists, just add files to it
--keepold don\'t delete previous (now renamed) target when done
--noindices don\'t include full index files in copy
--method=# method for copy (only "cp" currently supported)
@@ -98,6 +99,7 @@ GetOptions( \%opt,
"socket|S=s",
"allowold!",
"keepold!",
+ "addtodest!",
"noindices!",
"method=s",
"debug",
@@ -380,14 +382,14 @@ if ($opt{method} =~ /^cp\b/)
push @existing, $rdb->{target} if ( -d $rdb->{target} );
}
- if ( @existing && !$opt{allowold} )
+ if ( @existing && !($opt{allowold} || $opt{addtodest}) )
{
$dbh->disconnect();
- die "Can't hotcopy to '", join( "','", @existing ), "' because directory\nalready exist and the --allowold option was not given.\n"
+ die "Can't hotcopy to '", join( "','", @existing ), "' because directory\nalready exist and the --allowold or --addtodest options were not given.\n"
}
}
-retire_directory( @existing ) if ( @existing );
+retire_directory( @existing ) if @existing && !$opt{addtodest};
foreach my $rdb ( @db_desc ) {
foreach my $td ( '', @{$rdb->{raid_dirs}} ) {
@@ -403,8 +405,8 @@ foreach my $rdb ( @db_desc ) {
## ...
}
else {
- mkdir($tgt_dirpath, 0750)
- or die "Can't create '$tgt_dirpath': $!\n";
+ mkdir($tgt_dirpath, 0750) or die "Can't create '$tgt_dirpath': $!\n"
+ unless -d $tgt_dirpath;
}
}
}
@@ -861,6 +863,22 @@ Any existing versions of the backup directory are deleted.
Behaves as for the --allowold, with the additional feature
of keeping the backup directory after the copy successfully completes.
+=item --addtodest
+
+Don't rename target directory if it already exists, just add the
+copied files into it.
+
+This is most useful when backing up a database with many large
+tables and you don't want to have all the tables locked for the
+whole duration.
+
+In this situation, I<if> you are happy for groups of tables to be
+backed up separately (and thus possibly not be logically consistant
+with one another) then you can run mysqlhotcopy several times on
+the same database each with different db_name./table_regex/.
+All but the first should use the --addtodest option so the tables
+all end up in the same directory.
+
=item --flushlog
Rotate the log files by executing "FLUSH LOGS" after all tables are
@@ -869,13 +887,13 @@ locked, and before they are copied.
=item --resetmaster
Reset the bin-log by executing "RESET MASTER" after all tables are
-locked, and before they are copied. Usefull if you are recovering a
+locked, and before they are copied. Useful if you are recovering a
slave in a replication setup.
=item --resetslave
Reset the master.info by executing "RESET SLAVE" after all tables are
-locked, and before they are copied. Usefull if you are recovering a
+locked, and before they are copied. Useful if you are recovering a
server in a mutual replication setup.
=item --regexp pattern
@@ -941,7 +959,7 @@ will vary with your ability to understand how scp works. 'man scp'
and 'man ssh' are your friends.
The destination directory _must exist_ on the target machine using the
-scp method. --keepold and --allowold are meeningless with scp.
+scp method. --keepold and --allowold are meaningless with scp.
Liberal use of the --debug option will help you figure out what\'s
really going on when you do an scp.