Skip to content

Commit 2ea9ad8

Browse files
Luqun Louinikep
authored andcommitted
add option --data-path for mysqldump
Summary: mysqldump support dump each table as two file(.sql and .txt) into same directory. This new options is to allow dump tables into two directory: .sql directory and .txt direory. .sql directory is specified in --tab while .txt directory is specified in --data-path directory. Reviewed By: lth Differential Revision: D45404355
1 parent 064d5c1 commit 2ea9ad8

File tree

5 files changed

+208
-13
lines changed

5 files changed

+208
-13
lines changed

client/client_priv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ enum options_client {
210210
OPT_COMPRESS_DATA_CHUNK_SIZE,
211211
OPT_ORDER_BY_PRIMARY_FORCE_INDEX,
212212
OPT_READ_FROM_BINLOG_SERVER,
213+
OPT_DATA_PATH,
213214
/* Add new option above this */
214215
OPT_MAX_CLIENT_OPTION
215216
};

client/mysqldump.cc

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ static bool ansi_quotes_mode = false;
160160

161161
static uint opt_zstd_compress_level = default_zstd_compression_level;
162162
static char *opt_compress_algorithm = nullptr;
163+
static char *opt_data_path = nullptr;
163164

164165
#define MYSQL_OPT_SOURCE_DATA_EFFECTIVE_SQL 1
165166
#define MYSQL_OPT_SOURCE_DATA_COMMENTED_SQL 2
@@ -786,6 +787,12 @@ static struct my_option my_long_options[] = {
786787
"Split compressed data on chunks of specified size in megabytes",
787788
&opt_compression_chunk_size, &opt_compression_chunk_size, 0, GET_ULL,
788789
OPT_ARG, 0, 0, (ulonglong)(~(my_off_t)0), nullptr, 0, nullptr},
790+
{"data-path", OPT_DATA_PATH,
791+
"Store data textfile for each table to specificed data-path. if specified,"
792+
".txt file will be stored in specified data-path, while .sql will be "
793+
"stored in --tab path.",
794+
&opt_data_path, &opt_data_path, nullptr, GET_STR, OPT_ARG, 0, 0, 0,
795+
nullptr, 0, nullptr},
789796
{nullptr, 0, nullptr, nullptr, nullptr, nullptr, GET_NO_ARG, NO_ARG, 0, 0,
790797
0, nullptr, 0, nullptr}};
791798

@@ -1321,6 +1328,11 @@ static int get_options(int *argc, char ***argv) {
13211328
return (EX_USAGE);
13221329
}
13231330

1331+
if (opt_data_path && !path) {
1332+
// NO_LINT_DEBUG
1333+
fprintf(stderr, "%s: --data-path must be used with --tab.\n", my_progname);
1334+
return (EX_USAGE);
1335+
}
13241336
return (0);
13251337
} /* get_options */
13261338

@@ -4045,21 +4057,25 @@ static void dump_table(char *table, char *db) {
40454057
if (path) {
40464058
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
40474059

4048-
/*
4049-
Convert the path to native os format
4050-
and resolve to the full filepath.
4051-
*/
4052-
convert_dirname(tmp_path, path, NullS);
4053-
my_load_path(tmp_path, tmp_path, nullptr);
4054-
fn_format(filename, table, tmp_path, ".txt",
4055-
MYF(MY_UNPACK_FILENAME | MY_APPEND_EXT));
4056-
4057-
/* Must delete the file that 'INTO OUTFILE' will write to */
4058-
my_delete(filename, MYF(0));
4060+
if (opt_data_path) {
4061+
/* construct data file full path */
4062+
fn_format(filename, table, opt_data_path, ".txt", MYF(MY_APPEND_EXT));
4063+
} else {
4064+
/*
4065+
Convert the path to native os format
4066+
and resolve to the full filepath.
4067+
*/
4068+
convert_dirname(tmp_path, path, NullS);
4069+
my_load_path(tmp_path, tmp_path, nullptr);
4070+
fn_format(filename, table, tmp_path, ".txt",
4071+
MYF(MY_UNPACK_FILENAME | MY_APPEND_EXT));
40594072

4060-
/* convert to a unix path name to stick into the query */
4061-
to_unix_path(filename);
4073+
/* Must delete the file that 'INTO OUTFILE' will write to */
4074+
my_delete(filename, MYF(0));
40624075

4076+
/* convert to a unix path name to stick into the query */
4077+
to_unix_path(filename);
4078+
}
40634079
/* now build the query string */
40644080

40654081
dynstr_append_checked(&query_string, "SELECT /*!40001 SQL_NO_CACHE */ ");
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
CREATE DATABASE database1;
2+
USE database1;
3+
CREATE TABLE t1(a INT PRIMARY KEY, b INT UNIQUE) ENGINE = INNODB;
4+
INSERT INTO t1 VALUES (1, 3);
5+
INSERT INTO t1 VALUES (2, 2);
6+
INSERT INTO t1 VALUES (3, 1);
7+
==== mysqldump with --data-path ====
8+
DROP TABLE t1;
9+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t1.txt' INTO TABLE t1;;
10+
DROP TABLE t1;
11+
CREATE TABLE t2(x VARCHAR(100));
12+
CREATE TABLE t3(x VARCHAR(100));
13+
20000 20000 1620000
14+
200000 200000 16200000
15+
LOAD DATA LOCAL INFILE 'VARDIR/t2.tmp' INTO TABLE t2;;
16+
LOAD DATA LOCAL INFILE 'VARDIR/t3.tmp' INTO TABLE t3;;
17+
DROP TABLE t2, t3;
18+
t2.txt.0.zst
19+
t2.txt.1.zst
20+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t2.txt.0.zst' INTO TABLE t2 compressed;
21+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t2.txt.1.zst' INTO TABLE t2 compressed;
22+
t3.txt.0.zst
23+
t3.txt.1.zst
24+
t3.txt.10.zst
25+
t3.txt.11.zst
26+
t3.txt.12.zst
27+
t3.txt.13.zst
28+
t3.txt.14.zst
29+
t3.txt.15.zst
30+
t3.txt.2.zst
31+
t3.txt.3.zst
32+
t3.txt.4.zst
33+
t3.txt.5.zst
34+
t3.txt.6.zst
35+
t3.txt.7.zst
36+
t3.txt.8.zst
37+
t3.txt.9.zst
38+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.0.zst' INTO TABLE t3 compressed;
39+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.1.zst' INTO TABLE t3 compressed;
40+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.2.zst' INTO TABLE t3 compressed;
41+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.3.zst' INTO TABLE t3 compressed;
42+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.4.zst' INTO TABLE t3 compressed;
43+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.5.zst' INTO TABLE t3 compressed;
44+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.6.zst' INTO TABLE t3 compressed;
45+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.7.zst' INTO TABLE t3 compressed;
46+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.8.zst' INTO TABLE t3 compressed;
47+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.9.zst' INTO TABLE t3 compressed;
48+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.10.zst' INTO TABLE t3 compressed;
49+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.11.zst' INTO TABLE t3 compressed;
50+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.12.zst' INTO TABLE t3 compressed;
51+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.13.zst' INTO TABLE t3 compressed;
52+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.14.zst' INTO TABLE t3 compressed;
53+
LOAD DATA LOCAL INFILE 'VARDIR/.txt/t3.txt.15.zst' INTO TABLE t3 compressed;
54+
DROP TABLE t2, t3;
55+
DROP DATABASE database1;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
--local-infile=ON
2+
--secure-file-priv=""
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
CREATE DATABASE database1;
2+
USE database1;
3+
4+
#
5+
# small table, without compression and chunk
6+
#
7+
CREATE TABLE t1(a INT PRIMARY KEY, b INT UNIQUE) ENGINE = INNODB;
8+
9+
INSERT INTO t1 VALUES (1, 3);
10+
INSERT INTO t1 VALUES (2, 2);
11+
INSERT INTO t1 VALUES (3, 1);
12+
13+
--exec mkdir $MYSQL_TMP_DIR/.sql
14+
--exec mkdir $MYSQL_TMP_DIR/.txt
15+
16+
--echo ==== mysqldump with --data-path ====
17+
--replace_regex /-- Server version.*/-- SERVER VERSION/ /-- MySQL dump.*[)]/-- MYSQLDUMP VERSION/
18+
--exec $MYSQL_DUMP --tab=$MYSQL_TMP_DIR/.sql --data-path=$MYSQL_TMP_DIR/.txt database1
19+
20+
--let $checksum1_1=`CHECKSUM TABLE t1`
21+
22+
DROP TABLE t1;
23+
24+
--exec $MYSQL --disable-comments database1 2>&1 < "$MYSQL_TMP_DIR/.sql/t1.sql"
25+
26+
--replace_result $MYSQL_TMP_DIR VARDIR
27+
--eval LOAD DATA LOCAL INFILE '$MYSQL_TMP_DIR/.txt/t1.txt' INTO TABLE t1;
28+
--let $checksum1_2=`CHECKSUM TABLE t1`
29+
if($checksum1_1 != $checksum1_2)
30+
{
31+
--echo "table t1 checksums do no not match: [$checksum1] != [$checksum2]"
32+
}
33+
# cleanup
34+
DROP TABLE t1;
35+
--force-rmdir $MYSQL_TMP_DIR/.sql
36+
--force-rmdir $MYSQL_TMP_DIR/.txt
37+
38+
#
39+
# big table with compress and chunk
40+
#
41+
CREATE TABLE t2(x VARCHAR(100));
42+
CREATE TABLE t3(x VARCHAR(100));
43+
44+
# generate random data
45+
--exec dd bs=20000000 count=1 if=/dev/urandom | base64 -w 80 > $MYSQL_TMP_DIR/t.tmp
46+
--exec head -n 20000 $MYSQL_TMP_DIR/t.tmp | tee $MYSQL_TMP_DIR/t2.tmp | wc
47+
--exec head -n 200000 $MYSQL_TMP_DIR/t.tmp | tee $MYSQL_TMP_DIR/t3.tmp | wc
48+
--remove_file $MYSQL_TMP_DIR/t.tmp
49+
50+
# load data into table
51+
--replace_result $MYSQL_TMP_DIR VARDIR
52+
--eval LOAD DATA LOCAL INFILE '$MYSQL_TMP_DIR/t2.tmp' INTO TABLE t2;
53+
--replace_result $MYSQL_TMP_DIR VARDIR
54+
--eval LOAD DATA LOCAL INFILE '$MYSQL_TMP_DIR/t3.tmp' INTO TABLE t3;
55+
--remove_file $MYSQL_TMP_DIR/t2.tmp
56+
--remove_file $MYSQL_TMP_DIR/t3.tmp
57+
58+
# dump input compressed with zstd
59+
--exec mkdir $MYSQL_TMP_DIR/.sql
60+
--exec mkdir $MYSQL_TMP_DIR/.txt
61+
--exec $MYSQL_DUMP --tab=$MYSQL_TMP_DIR/.sql database1 --compress-data --compress-data-chunk-size=1 --data-path=$MYSQL_TMP_DIR/.txt
62+
63+
--let $checksum2_1=`CHECKSUM TABLE t2`
64+
--let $t2_cnt = `SELECT COUNT(*) from t2`
65+
--let $checksum3_1=`CHECKSUM TABLE t3`
66+
--let $t3_cnt = `SELECT COUNT(*) from t3`
67+
68+
DROP TABLE t2, t3;
69+
70+
# creat t2
71+
--exec $MYSQL --disable-comments database1 2>&1 < "$MYSQL_TMP_DIR/.sql/t2.sql"
72+
73+
# load t2 data
74+
--list_files_write_file $MYSQL_TMP_DIR/t2_filelist $MYSQL_TMP_DIR/.txt/ t2.txt.*.zst
75+
--cat_file $MYSQL_TMP_DIR/t2_filelist
76+
--let $count = 2
77+
--let $i = 0
78+
while ($i < $count) {
79+
--replace_result $MYSQL_TMP_DIR VARDIR
80+
--eval LOAD DATA LOCAL INFILE '$MYSQL_TMP_DIR/.txt/t2.txt.$i.zst' INTO TABLE t2 compressed
81+
--inc $i
82+
}
83+
# check t2 data
84+
--let $checksum2_2=`CHECKSUM TABLE t2`
85+
if($checksum2_1 != $checksum2_2)
86+
{
87+
--echo "table t2 checksums do no not match: [$checksum2_1] != [$checksum2_2]"
88+
}
89+
90+
# create t3
91+
--exec $MYSQL --disable-comments database1 2>&1 < "$MYSQL_TMP_DIR/.sql/t3.sql"
92+
# load data into t3
93+
--list_files_write_file $MYSQL_TMP_DIR/t3_filelist $MYSQL_TMP_DIR/.txt/ t3.txt.*.zst
94+
--cat_file $MYSQL_TMP_DIR/t3_filelist
95+
--let $count = 16
96+
--let $i = 0
97+
while ($i < $count) {
98+
--replace_result $MYSQL_TMP_DIR VARDIR
99+
--eval LOAD DATA LOCAL INFILE '$MYSQL_TMP_DIR/.txt/t3.txt.$i.zst' INTO TABLE t3 compressed
100+
--inc $i
101+
}
102+
# check t3 data
103+
--let $checksum3_2=`CHECKSUM TABLE t3`
104+
if($checksum3_1 != $checksum3_2)
105+
{
106+
--echo "table t3 checksums do no not match: [$checksum3_1] != [$checksum3_2]"
107+
# --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
108+
# eval SELECT * FROM t3 INTO OUTFILE '$MYSQL_TMP_DIR/B11764517.tmp';
109+
}
110+
--let $t3_cnt_2 = `SELECT COUNT(*) from t3`
111+
if($t3_cnt != $t3_cnt_2)
112+
{
113+
--echo "table t3 count do no not match: [$t3_cnt] != [$t3_cnt_2]"
114+
}
115+
# cleanup
116+
DROP TABLE t2, t3;
117+
--force-rmdir $MYSQL_TMP_DIR/.sql
118+
--force-rmdir $MYSQL_TMP_DIR/.txt
119+
--remove_file $MYSQL_TMP_DIR/t2_filelist
120+
--remove_file $MYSQL_TMP_DIR/t3_filelist
121+
DROP DATABASE database1;

0 commit comments

Comments
 (0)