Skip to content

Commit f00dcb6

Browse files
Luqun LouHerman Lee
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 0c67f42 commit f00dcb6

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
@@ -157,6 +157,7 @@ static bool ansi_quotes_mode = false;
157157

158158
static uint opt_zstd_compress_level = default_zstd_compression_level;
159159
static char *opt_compress_algorithm = nullptr;
160+
static char *opt_data_path = nullptr;
160161

161162
#define MYSQL_OPT_SOURCE_DATA_EFFECTIVE_SQL 1
162163
#define MYSQL_OPT_SOURCE_DATA_COMMENTED_SQL 2
@@ -783,6 +784,12 @@ static struct my_option my_long_options[] = {
783784
"Split compressed data on chunks of specified size in megabytes",
784785
&opt_compression_chunk_size, &opt_compression_chunk_size, 0, GET_ULL,
785786
OPT_ARG, 0, 0, (ulonglong)(~(my_off_t)0), nullptr, 0, nullptr},
787+
{"data-path", OPT_DATA_PATH,
788+
"Store data textfile for each table to specificed data-path. if specified,"
789+
".txt file will be stored in specified data-path, while .sql will be "
790+
"stored in --tab path.",
791+
&opt_data_path, &opt_data_path, nullptr, GET_STR, OPT_ARG, 0, 0, 0,
792+
nullptr, 0, nullptr},
786793
{nullptr, 0, nullptr, nullptr, nullptr, nullptr, GET_NO_ARG, NO_ARG, 0, 0,
787794
0, nullptr, 0, nullptr}};
788795

@@ -1317,6 +1324,11 @@ static int get_options(int *argc, char ***argv) {
13171324
return (EX_USAGE);
13181325
}
13191326

1327+
if (opt_data_path && !path) {
1328+
// NO_LINT_DEBUG
1329+
fprintf(stderr, "%s: --data-path must be used with --tab.\n", my_progname);
1330+
return (EX_USAGE);
1331+
}
13201332
return (0);
13211333
} /* get_options */
13221334

@@ -4041,21 +4053,25 @@ static void dump_table(char *table, char *db) {
40414053
if (path) {
40424054
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
40434055

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

4056-
/* convert to a unix path name to stick into the query */
4057-
to_unix_path(filename);
4069+
/* Must delete the file that 'INTO OUTFILE' will write to */
4070+
my_delete(filename, MYF(0));
40584071

4072+
/* convert to a unix path name to stick into the query */
4073+
to_unix_path(filename);
4074+
}
40594075
/* now build the query string */
40604076

40614077
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)