Skip to content

Commit 2f08e3a

Browse files
yashtcfacebook-github-bot
authored andcommitted
Added db_metadata options to create database command
Summary: Added new option db_metadata to the create database `CREATE DATABASE [IF NOT EXISTS] db_name DB_METADATA [=] metadata` The new option is stored in the db.opt file along with other database options like charset and read_only. The options accepts any string value. If not specified, it writes empty string as the default value in the db.opt file. To retrieve the option value for a particular database, the show command can be used as follows: `SHOW CREATE DATABASE db_name` Example Usage: create database test2 charset utf8 read_only = true db_metadata '{\'shard_name\':\'myshard_for_test2\'}'; show create database test2; Output: +----------+--------------------------------------------------------------------------------------------------------------------------+ | Database | Create Database | +----------+--------------------------------------------------------------------------------------------------------------------------+ | test2 | CREATE DATABASE `test2` /*!40100 DEFAULT CHARACTER SET utf8 READ_ONLY DB_METADATA {'shard_name':'myshard_for_test2'} */ | +----------+--------------------------------------------------------------------------------------------------------------------------+ Reviewed By: tianx Differential Revision: D5358178 fbshipit-source-id: 4308ca2
1 parent 745ad33 commit 2f08e3a

10 files changed

+427
-15
lines changed

mysql-test/r/db_metadata.result

+186
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
drop database if exists test2;
2+
drop database if exists test3;
3+
drop database if exists test4;
4+
drop database if exists test5;
5+
drop database if exists test6;
6+
drop database if exists test7;
7+
drop database if exists test8;
8+
drop database if exists test9;
9+
create database test2;
10+
show create database test2;
11+
Database Create Database
12+
test2 CREATE DATABASE `test2` /*!40100 DEFAULT CHARACTER SET latin1 */
13+
default-character-set=latin1
14+
default-collation=latin1_swedish_ci
15+
db-read-only=0
16+
db-metadata=
17+
create database test3 character set utf8;
18+
show create database test3;
19+
Database Create Database
20+
test3 CREATE DATABASE `test3` /*!40100 DEFAULT CHARACTER SET utf8 */
21+
default-character-set=utf8
22+
default-collation=utf8_general_ci
23+
db-read-only=0
24+
db-metadata=
25+
create database test4 read_only = true;
26+
show create database test4;
27+
Database Create Database
28+
test4 CREATE DATABASE `test4` /*!40100 DEFAULT CHARACTER SET latin1 READ_ONLY */
29+
default-character-set=latin1
30+
default-collation=latin1_swedish_ci
31+
db-read-only=1
32+
db-metadata=
33+
create database test5 db_metadata = "{\"shard\":\"test5_shard\"}";
34+
show create database test5;
35+
Database Create Database
36+
test5 CREATE DATABASE `test5` /*!40100 DEFAULT CHARACTER SET latin1 DB_METADATA {"shard":"test5_shard"} */
37+
default-character-set=latin1
38+
default-collation=latin1_swedish_ci
39+
db-read-only=0
40+
db-metadata={"shard":"test5_shard"}
41+
create database test6 character set utf8 db_metadata = "{\"shard\":\"test6_shard\"}";
42+
show create database test6;
43+
Database Create Database
44+
test6 CREATE DATABASE `test6` /*!40100 DEFAULT CHARACTER SET utf8 DB_METADATA {"shard":"test6_shard"} */
45+
default-character-set=utf8
46+
default-collation=utf8_general_ci
47+
db-read-only=0
48+
db-metadata={"shard":"test6_shard"}
49+
create database test7 read_only = true db_metadata = "{\"shard\":\"test7_shard\"}";
50+
show create database test7;
51+
Database Create Database
52+
test7 CREATE DATABASE `test7` /*!40100 DEFAULT CHARACTER SET latin1 READ_ONLY DB_METADATA {"shard":"test7_shard"} */
53+
default-character-set=latin1
54+
default-collation=latin1_swedish_ci
55+
db-read-only=1
56+
db-metadata={"shard":"test7_shard"}
57+
create database test8 character set utf8 read_only = true;
58+
show create database test8;
59+
Database Create Database
60+
test8 CREATE DATABASE `test8` /*!40100 DEFAULT CHARACTER SET utf8 READ_ONLY */
61+
default-character-set=utf8
62+
default-collation=utf8_general_ci
63+
db-read-only=1
64+
db-metadata=
65+
create database test9 character set utf8 read_only = true db_metadata = "{\"shard\":\"test9_shard\"}";
66+
show create database test9;
67+
Database Create Database
68+
test9 CREATE DATABASE `test9` /*!40100 DEFAULT CHARACTER SET utf8 READ_ONLY DB_METADATA {"shard":"test9_shard"} */
69+
default-character-set=utf8
70+
default-collation=utf8_general_ci
71+
db-read-only=1
72+
db-metadata={"shard":"test9_shard"}
73+
alter database test3 character set ascii;
74+
show create database test3;
75+
Database Create Database
76+
test3 CREATE DATABASE `test3` /*!40100 DEFAULT CHARACTER SET ascii */
77+
default-character-set=ascii
78+
default-collation=ascii_general_ci
79+
db-read-only=0
80+
db-metadata=
81+
alter database test4 read_only = true;
82+
show create database test4;
83+
Database Create Database
84+
test4 CREATE DATABASE `test4` /*!40100 DEFAULT CHARACTER SET latin1 READ_ONLY */
85+
default-character-set=latin1
86+
default-collation=latin1_swedish_ci
87+
db-read-only=1
88+
db-metadata=
89+
alter database test5 db_metadata = "{\"shard\":\"test5_shard_altered\"}";
90+
show create database test5;
91+
Database Create Database
92+
test5 CREATE DATABASE `test5` /*!40100 DEFAULT CHARACTER SET latin1 DB_METADATA {"shard":"test5_shard_altered"} */
93+
default-character-set=latin1
94+
default-collation=latin1_swedish_ci
95+
db-read-only=0
96+
db-metadata={"shard":"test5_shard_altered"}
97+
alter database test5 character set ascii;
98+
show create database test5;
99+
Database Create Database
100+
test5 CREATE DATABASE `test5` /*!40100 DEFAULT CHARACTER SET ascii DB_METADATA {"shard":"test5_shard_altered"} */
101+
default-character-set=ascii
102+
default-collation=ascii_general_ci
103+
db-read-only=0
104+
db-metadata={"shard":"test5_shard_altered"}
105+
alter database test5 read_only = true;
106+
show create database test5;
107+
Database Create Database
108+
test5 CREATE DATABASE `test5` /*!40100 DEFAULT CHARACTER SET ascii READ_ONLY DB_METADATA {"shard":"test5_shard_altered"} */
109+
default-character-set=ascii
110+
default-collation=ascii_general_ci
111+
db-read-only=1
112+
db-metadata={"shard":"test5_shard_altered"}
113+
alter database test5 character set utf8 read_only = false;
114+
show create database test5;
115+
Database Create Database
116+
test5 CREATE DATABASE `test5` /*!40100 DEFAULT CHARACTER SET utf8 DB_METADATA {"shard":"test5_shard_altered"} */
117+
default-character-set=utf8
118+
default-collation=utf8_general_ci
119+
db-read-only=0
120+
db-metadata={"shard":"test5_shard_altered"}
121+
alter database test5 db_metadata "";
122+
show create database test5;
123+
Database Create Database
124+
test5 CREATE DATABASE `test5` /*!40100 DEFAULT CHARACTER SET utf8 */
125+
default-character-set=utf8
126+
default-collation=utf8_general_ci
127+
db-read-only=0
128+
db-metadata=
129+
alter database test5 db_metadata "{\"shard\":\"Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Fin\"}";
130+
show create database test5;
131+
Database Create Database
132+
test5 CREATE DATABASE `test5` /*!40100 DEFAULT CHARACTER SET utf8 DB_METADATA {"shard":"Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Fin"} */
133+
default-character-set=utf8
134+
default-collation=utf8_general_ci
135+
db-read-only=0
136+
db-metadata={"shard":"Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Fin"}
137+
alter database test5 db_metadata "{\"shard\":\"Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Fin\"}";;
138+
ERROR HY000: Metadata for the database is too long. Max length is 1024 bytes
139+
alter database test6 character set ascii db_metadata = "{\"shard\":\"test6_shard_altered\"}";
140+
show create database test6;
141+
Database Create Database
142+
test6 CREATE DATABASE `test6` /*!40100 DEFAULT CHARACTER SET ascii DB_METADATA {"shard":"test6_shard_altered"} */
143+
default-character-set=ascii
144+
default-collation=ascii_general_ci
145+
db-read-only=0
146+
db-metadata={"shard":"test6_shard_altered"}
147+
alter database test7 read_only = true db_metadata = "{\"shard\":\"test7_shard_altered\"}";
148+
show create database test7;
149+
Database Create Database
150+
test7 CREATE DATABASE `test7` /*!40100 DEFAULT CHARACTER SET latin1 READ_ONLY DB_METADATA {"shard":"test7_shard_altered"} */
151+
default-character-set=latin1
152+
default-collation=latin1_swedish_ci
153+
db-read-only=1
154+
db-metadata={"shard":"test7_shard_altered"}
155+
alter database test8 character set ascii read_only = true;
156+
show create database test8;
157+
Database Create Database
158+
test8 CREATE DATABASE `test8` /*!40100 DEFAULT CHARACTER SET ascii READ_ONLY */
159+
default-character-set=ascii
160+
default-collation=ascii_general_ci
161+
db-read-only=1
162+
db-metadata=
163+
alter database test9 character set ascii read_only = true db_metadata = "{\"shard\":\"test9_shard_altered\"}";
164+
show create database test9;
165+
Database Create Database
166+
test9 CREATE DATABASE `test9` /*!40100 DEFAULT CHARACTER SET ascii READ_ONLY DB_METADATA {"shard":"test9_shard_altered"} */
167+
default-character-set=ascii
168+
default-collation=ascii_general_ci
169+
db-read-only=1
170+
db-metadata={"shard":"test9_shard_altered"}
171+
show create database information_schema;
172+
Database Create Database
173+
information_schema CREATE DATABASE `information_schema` /*!40100 DEFAULT CHARACTER SET utf8 */
174+
show create database mysql;
175+
Database Create Database
176+
mysql CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */
177+
alter database information_schema db_metadata "{\"shard\":\"is_shard\"}";;
178+
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
179+
drop database if exists test2;
180+
drop database if exists test3;
181+
drop database if exists test4;
182+
drop database if exists test5;
183+
drop database if exists test6;
184+
drop database if exists test7;
185+
drop database if exists test8;
186+
drop database if exists test9;

mysql-test/t/db_metadata.test

+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# Test per-database database-metadata attribute
2+
--source include/have_innodb.inc
3+
connection default;
4+
5+
--disable_warnings
6+
drop database if exists test2;
7+
drop database if exists test3;
8+
drop database if exists test4;
9+
drop database if exists test5;
10+
drop database if exists test6;
11+
drop database if exists test7;
12+
drop database if exists test8;
13+
drop database if exists test9;
14+
--enable_warnings
15+
16+
--disable_query_log
17+
let $MYSQLD_DATADIR= `select @@datadir`;
18+
--enable_query_log
19+
20+
--error 1
21+
file_exists $MYSQLD_DATADIR/mysql/db.opt;
22+
--error 1
23+
file_exists $MYSQLD_DATADIR/test/db.opt;
24+
25+
# create database without any options
26+
create database test2;
27+
show create database test2;
28+
--exec cat $MYSQLD_DATADIR/test2/db.opt;
29+
30+
# create database with character set
31+
create database test3 character set utf8;
32+
show create database test3;
33+
--exec cat $MYSQLD_DATADIR/test3/db.opt;
34+
35+
# create database with read only
36+
create database test4 read_only = true;
37+
show create database test4;
38+
--exec cat $MYSQLD_DATADIR/test4/db.opt;
39+
40+
# create database with db metadata
41+
create database test5 db_metadata = "{\"shard\":\"test5_shard\"}";
42+
show create database test5;
43+
--exec cat $MYSQLD_DATADIR/test5/db.opt;
44+
45+
# create database with character set and db metadata
46+
create database test6 character set utf8 db_metadata = "{\"shard\":\"test6_shard\"}";
47+
show create database test6;
48+
--exec cat $MYSQLD_DATADIR/test6/db.opt;
49+
50+
# create database with read only and db metadata
51+
create database test7 read_only = true db_metadata = "{\"shard\":\"test7_shard\"}";
52+
show create database test7;
53+
--exec cat $MYSQLD_DATADIR/test7/db.opt;
54+
55+
# create database with character set and read only
56+
create database test8 character set utf8 read_only = true;
57+
show create database test8;
58+
--exec cat $MYSQLD_DATADIR/test8/db.opt;
59+
60+
# create database with character set, read only and db metadata
61+
create database test9 character set utf8 read_only = true db_metadata = "{\"shard\":\"test9_shard\"}";
62+
show create database test9;
63+
--exec cat $MYSQLD_DATADIR/test9/db.opt;
64+
65+
# alter database tests
66+
67+
# alter database character set
68+
alter database test3 character set ascii;
69+
show create database test3;
70+
--exec cat $MYSQLD_DATADIR/test3/db.opt;
71+
72+
# alter database read only
73+
alter database test4 read_only = true;
74+
show create database test4;
75+
--exec cat $MYSQLD_DATADIR/test4/db.opt;
76+
77+
# alter database db metadata
78+
alter database test5 db_metadata = "{\"shard\":\"test5_shard_altered\"}";
79+
show create database test5;
80+
--exec cat $MYSQLD_DATADIR/test5/db.opt;
81+
82+
# alter database character set but keep db metadata intact
83+
alter database test5 character set ascii;
84+
show create database test5;
85+
--exec cat $MYSQLD_DATADIR/test5/db.opt;
86+
87+
# alter database read only but keep db metadata intact
88+
alter database test5 read_only = true;
89+
show create database test5;
90+
--exec cat $MYSQLD_DATADIR/test5/db.opt;
91+
92+
# alter database character set and read only but keep db metadata intact
93+
alter database test5 character set utf8 read_only = false;
94+
show create database test5;
95+
--exec cat $MYSQLD_DATADIR/test5/db.opt;
96+
97+
# alter database reset db metadata
98+
alter database test5 db_metadata "";
99+
show create database test5;
100+
--exec cat $MYSQLD_DATADIR/test5/db.opt;
101+
102+
# alter database set db metadata to max length string
103+
alter database test5 db_metadata "{\"shard\":\"Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Fin\"}";
104+
show create database test5;
105+
--exec cat $MYSQLD_DATADIR/test5/db.opt;
106+
107+
# alter database exceed db metadata max length
108+
--error ER_DB_METADATA_TOO_LONG
109+
--eval alter database test5 db_metadata \"{\\\"shard\\\":\\\"Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Really long shard name. Fin\\\"}\";
110+
111+
# alter database character set and db metadata
112+
alter database test6 character set ascii db_metadata = "{\"shard\":\"test6_shard_altered\"}";
113+
show create database test6;
114+
--exec cat $MYSQLD_DATADIR/test6/db.opt;
115+
116+
# alter database read only and db metadata
117+
alter database test7 read_only = true db_metadata = "{\"shard\":\"test7_shard_altered\"}";
118+
show create database test7;
119+
--exec cat $MYSQLD_DATADIR/test7/db.opt;
120+
121+
# alter database character set and read only
122+
alter database test8 character set ascii read_only = true;
123+
show create database test8;
124+
--exec cat $MYSQLD_DATADIR/test8/db.opt;
125+
126+
# alter database character set, read only and db metadata
127+
alter database test9 character set ascii read_only = true db_metadata = "{\"shard\":\"test9_shard_altered\"}";
128+
show create database test9;
129+
--exec cat $MYSQLD_DATADIR/test9/db.opt;
130+
131+
# ensure information_schema and mysql tables are intact
132+
show create database information_schema;
133+
show create database mysql;
134+
--error ER_DBACCESS_DENIED_ERROR
135+
--eval alter database information_schema db_metadata \"{\\"shard\\":\\"is_shard\\"}\";
136+
137+
# cleanup
138+
--disable_warnings
139+
drop database if exists test2;
140+
drop database if exists test3;
141+
drop database if exists test4;
142+
drop database if exists test5;
143+
drop database if exists test6;
144+
drop database if exists test7;
145+
drop database if exists test8;
146+
drop database if exists test9;
147+
--enable_warnings

sql/handler.h

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <regex>
4040
#include <vector>
4141
#include <unordered_set>
42+
#include <sql_string.h>
4243

4344
class Alter_info;
4445

@@ -1094,6 +1095,7 @@ typedef struct st_ha_create_information
10941095
means it is explicitly set to default or
10951096
it is not specified in alter */
10961097
enum enum_db_read_only db_read_only;
1098+
String db_metadata;
10971099
LEX_STRING connect_string;
10981100
const char *password, *tablespace;
10991101
LEX_STRING comment;

sql/lex.h

+1
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ static SYMBOL symbols[] = {
168168
{ "DAY_MICROSECOND", SYM(DAY_MICROSECOND_SYM)},
169169
{ "DAY_MINUTE", SYM(DAY_MINUTE_SYM)},
170170
{ "DAY_SECOND", SYM(DAY_SECOND_SYM)},
171+
{ "DB_METADATA", SYM(DB_METADATA_SYM)},
171172
{ "DEALLOCATE", SYM(DEALLOCATE_SYM)},
172173
{ "DEC", SYM(DECIMAL_SYM)},
173174
{ "DECIMAL", SYM(DECIMAL_SYM)},

sql/share/errmsg-utf8.txt

+6
Original file line numberDiff line numberDiff line change
@@ -7323,6 +7323,12 @@ ER_CANT_SET_DEPENDENCY_REPLICATION_WITHOUT_IDEMPOTENT_RECOVERY
73237323
ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR
73247324
eng "Slave worker has stopped after at least one previous worker encountered an error when mts_dependency_order_commits was enabled. To preserve commit order, the last transaction executed by this thread has not been committed. When restarting the slave after fixing any failed threads, you should fix this worker as well."
73257325

7326+
ER_DB_METADATA_TOO_LONG
7327+
eng "Metadata for the database is too long. Max length is %d bytes"
7328+
7329+
ER_DB_METADATA_READ_ERROR
7330+
eng "Error reading db metadata option: '%-.64s'"
7331+
73267332
#
73277333
# End of 5.6 error messages.
73287334
#

0 commit comments

Comments
 (0)