Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
d1be5ec6
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d1be5ec6
编写于
7月 06, 2020
作者:
A
Alexander Tokmakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix symlinks, add short syntax of attach database
上级
383c583b
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
83 addition
and
31 deletion
+83
-31
programs/copier/ClusterCopierApp.cpp
programs/copier/ClusterCopierApp.cpp
+1
-1
programs/local/LocalServer.cpp
programs/local/LocalServer.cpp
+2
-2
src/Databases/DatabaseAtomic.cpp
src/Databases/DatabaseAtomic.cpp
+2
-4
src/Databases/DatabaseAtomic.h
src/Databases/DatabaseAtomic.h
+3
-3
src/Databases/DatabaseOnDisk.cpp
src/Databases/DatabaseOnDisk.cpp
+12
-2
src/Interpreters/DatabaseCatalog.cpp
src/Interpreters/DatabaseCatalog.cpp
+26
-3
src/Interpreters/DatabaseCatalog.h
src/Interpreters/DatabaseCatalog.h
+6
-1
src/Interpreters/InterpreterCreateQuery.cpp
src/Interpreters/InterpreterCreateQuery.cpp
+25
-9
src/Interpreters/loadMetadata.cpp
src/Interpreters/loadMetadata.cpp
+1
-1
src/Interpreters/tests/in_join_subqueries_preprocessor.cpp
src/Interpreters/tests/in_join_subqueries_preprocessor.cpp
+1
-1
src/Storages/tests/gtest_transform_query_for_external_database.cpp
...ges/tests/gtest_transform_query_for_external_database.cpp
+1
-1
tests/queries/0_stateless/01107_atomic_db_detach_attach.sh
tests/queries/0_stateless/01107_atomic_db_detach_attach.sh
+1
-1
tests/queries/0_stateless/01114_database_atomic.sh
tests/queries/0_stateless/01114_database_atomic.sh
+2
-2
未找到文件。
programs/copier/ClusterCopierApp.cpp
浏览文件 @
d1be5ec6
...
...
@@ -114,7 +114,7 @@ void ClusterCopierApp::mainImpl()
registerDisks
();
static
const
std
::
string
default_database
=
"_local"
;
DatabaseCatalog
::
instance
().
attachDatabase
(
default_database
,
std
::
make_shared
<
DatabaseMemory
>
(
default_database
,
*
context
));
DatabaseCatalog
::
instance
().
attachDatabase
(
default_database
,
UUIDHelpers
::
Nil
,
std
::
make_shared
<
DatabaseMemory
>
(
default_database
,
*
context
));
context
->
setCurrentDatabase
(
default_database
);
/// Initialize query scope just in case.
...
...
programs/local/LocalServer.cpp
浏览文件 @
d1be5ec6
...
...
@@ -164,7 +164,7 @@ static void attachSystemTables(const Context & context)
{
/// TODO: add attachTableDelayed into DatabaseMemory to speedup loading
system_database
=
std
::
make_shared
<
DatabaseMemory
>
(
DatabaseCatalog
::
SYSTEM_DATABASE
,
context
);
DatabaseCatalog
::
instance
().
attachDatabase
(
DatabaseCatalog
::
SYSTEM_DATABASE
,
system_database
);
DatabaseCatalog
::
instance
().
attachDatabase
(
DatabaseCatalog
::
SYSTEM_DATABASE
,
UUIDHelpers
::
Nil
,
system_database
);
}
attachSystemTablesLocal
(
*
system_database
);
...
...
@@ -241,7 +241,7 @@ try
* if such tables will not be dropped, clickhouse-server will not be able to load them due to security reasons.
*/
std
::
string
default_database
=
config
().
getString
(
"default_database"
,
"_local"
);
DatabaseCatalog
::
instance
().
attachDatabase
(
default_database
,
std
::
make_shared
<
DatabaseMemory
>
(
default_database
,
*
context
));
DatabaseCatalog
::
instance
().
attachDatabase
(
default_database
,
UUIDHelpers
::
Nil
,
std
::
make_shared
<
DatabaseMemory
>
(
default_database
,
*
context
));
context
->
setCurrentDatabase
(
default_database
);
applyCmdOptions
();
...
...
src/Databases/DatabaseAtomic.cpp
浏览文件 @
d1be5ec6
...
...
@@ -102,7 +102,6 @@ void DatabaseAtomic::attachTable(const String & name, const StoragePtr & table,
assertDetachedTableNotInUse
(
table
->
getStorageID
().
uuid
);
DatabaseWithDictionaries
::
attachTableUnlocked
(
name
,
table
,
lock
);
table_name_to_path
.
emplace
(
std
::
make_pair
(
name
,
relative_table_path
));
//tryCreateSymlink(name, relative_table_path);
}
StoragePtr
DatabaseAtomic
::
detachTable
(
const
String
&
name
)
...
...
@@ -113,7 +112,6 @@ StoragePtr DatabaseAtomic::detachTable(const String & name)
table_name_to_path
.
erase
(
name
);
detached_tables
.
emplace
(
table
->
getStorageID
().
uuid
,
table
);
not_in_use
=
cleenupDetachedTables
();
//tryRemoveSymlink(name);
return
table
;
}
...
...
@@ -360,7 +358,7 @@ void DatabaseAtomic::tryCreateSymlink(const String & table_name, const String &
}
catch
(...)
{
tryLogCurrentException
(
log
);
LOG_WARNING
(
log
,
getCurrentExceptionMessage
(
true
)
);
}
}
...
...
@@ -373,7 +371,7 @@ void DatabaseAtomic::tryRemoveSymlink(const String & table_name)
}
catch
(...)
{
tryLogCurrentException
(
log
);
LOG_WARNING
(
log
,
getCurrentExceptionMessage
(
true
)
);
}
}
...
...
src/Databases/DatabaseAtomic.h
浏览文件 @
d1be5ec6
...
...
@@ -52,6 +52,9 @@ public:
UUID
tryGetTableUUID
(
const
String
&
table_name
)
const
override
;
void
tryCreateSymlink
(
const
String
&
table_name
,
const
String
&
actual_data_path
);
void
tryRemoveSymlink
(
const
String
&
table_name
);
private:
void
commitAlterTable
(
const
StorageID
&
table_id
,
const
String
&
table_metadata_tmp_path
,
const
String
&
table_metadata_path
)
override
;
void
commitCreateTable
(
const
ASTCreateQuery
&
query
,
const
StoragePtr
&
table
,
...
...
@@ -61,9 +64,6 @@ private:
typedef
std
::
unordered_map
<
UUID
,
StoragePtr
>
DetachedTables
;
[[
nodiscard
]]
DetachedTables
cleenupDetachedTables
();
void
tryCreateSymlink
(
const
String
&
table_name
,
const
String
&
actual_data_path
);
void
tryRemoveSymlink
(
const
String
&
table_name
);
//TODO store path in DatabaseWithOwnTables::tables
typedef
std
::
unordered_map
<
String
,
String
>
NameToPathMap
;
NameToPathMap
table_name_to_path
;
...
...
src/Databases/DatabaseOnDisk.cpp
浏览文件 @
d1be5ec6
...
...
@@ -20,6 +20,7 @@
#include <Databases/DatabaseOrdinary.h>
#include <Databases/DatabaseAtomic.h>
#include <Common/assert_cast.h>
namespace
DB
...
...
@@ -305,6 +306,14 @@ void DatabaseOnDisk::renameTable(
to_database
.
createTable
(
context
,
to_table_name
,
table
,
attach_query
);
Poco
::
File
(
table_metadata_path
).
remove
();
/// Special case: usually no actions with symlinks are required when detaching/attaching table,
/// but not when moving from Atomic database to Ordinary
if
(
from_atomic_to_ordinary
)
{
auto
&
atomic_db
=
assert_cast
<
DatabaseAtomic
&>
(
*
this
);
atomic_db
.
tryRemoveSymlink
(
table_name
);
}
}
ASTPtr
DatabaseOnDisk
::
getCreateTableQueryImpl
(
const
String
&
table_name
,
const
Context
&
,
bool
throw_on_error
)
const
...
...
@@ -444,7 +453,8 @@ ASTPtr DatabaseOnDisk::parseQueryFromMetadata(Poco::Logger * logger, const Conte
*/
if
(
remove_empty
&&
query
.
empty
())
{
LOG_ERROR
(
logger
,
"File {} is empty. Removing."
,
metadata_file_path
);
if
(
logger
)
LOG_ERROR
(
logger
,
"File {} is empty. Removing."
,
metadata_file_path
);
Poco
::
File
(
metadata_file_path
).
remove
();
return
nullptr
;
}
...
...
@@ -467,7 +477,7 @@ ASTPtr DatabaseOnDisk::parseQueryFromMetadata(Poco::Logger * logger, const Conte
String
table_name
=
Poco
::
Path
(
metadata_file_path
).
makeFile
().
getBaseName
();
table_name
=
unescapeForFileName
(
table_name
);
if
(
create
.
table
!=
TABLE_WITH_UUID_NAME_PLACEHOLDER
)
if
(
create
.
table
!=
TABLE_WITH_UUID_NAME_PLACEHOLDER
&&
logger
)
LOG_WARNING
(
logger
,
"File {} contains both UUID and table name. Will use name `{}` instead of `{}`"
,
metadata_file_path
,
table_name
,
create
.
table
);
create
.
table
=
table_name
;
}
...
...
src/Interpreters/DatabaseCatalog.cpp
浏览文件 @
d1be5ec6
...
...
@@ -114,7 +114,7 @@ void DatabaseCatalog::loadDatabases()
drop_delay_sec
=
global_context
->
getConfigRef
().
getInt
(
"database_atomic_delay_before_drop_table_sec"
,
default_drop_delay_sec
);
auto
db_for_temporary_and_external_tables
=
std
::
make_shared
<
DatabaseMemory
>
(
TEMPORARY_DATABASE
,
*
global_context
);
attachDatabase
(
TEMPORARY_DATABASE
,
db_for_temporary_and_external_tables
);
attachDatabase
(
TEMPORARY_DATABASE
,
UUIDHelpers
::
Nil
,
db_for_temporary_and_external_tables
);
loadMarkedAsDroppedTables
();
auto
task_holder
=
global_context
->
getSchedulePool
().
createTask
(
"DatabaseCatalog"
,
[
this
](){
this
->
dropTableDataTask
();
});
...
...
@@ -147,6 +147,7 @@ void DatabaseCatalog::shutdownImpl()
std
::
lock_guard
lock
(
databases_mutex
);
assert
(
std
::
find_if_not
(
uuid_map
.
begin
(),
uuid_map
.
end
(),
[](
const
auto
&
elem
)
{
return
elem
.
map
.
empty
();
})
==
uuid_map
.
end
());
databases
.
clear
();
db_uuid_map
.
clear
();
view_dependencies
.
clear
();
}
...
...
@@ -246,11 +247,13 @@ void DatabaseCatalog::assertDatabaseDoesntExistUnlocked(const String & database_
throw
Exception
(
"Database "
+
backQuoteIfNeed
(
database_name
)
+
" already exists."
,
ErrorCodes
::
DATABASE_ALREADY_EXISTS
);
}
void
DatabaseCatalog
::
attachDatabase
(
const
String
&
database_name
,
const
DatabasePtr
&
database
)
void
DatabaseCatalog
::
attachDatabase
(
const
String
&
database_name
,
const
UUID
&
uuid
,
const
DatabasePtr
&
database
)
{
std
::
lock_guard
lock
{
databases_mutex
};
assertDatabaseDoesntExistUnlocked
(
database_name
);
databases
[
database_name
]
=
database
;
databases
.
emplace
(
database_name
,
database
);
if
(
uuid
!=
UUIDHelpers
::
Nil
)
db_uuid_map
.
emplace
(
uuid
,
database
);
}
...
...
@@ -275,6 +278,7 @@ DatabasePtr DatabaseCatalog::detachDatabase(const String & database_name, bool d
database_atomic
->
assertCanBeDetached
(
false
);
}
db_uuid_map
.
erase
(
db
->
getUUID
());
databases
.
erase
(
database_name
);
}
...
...
@@ -312,6 +316,25 @@ DatabasePtr DatabaseCatalog::tryGetDatabase(const String & database_name) const
return
it
->
second
;
}
DatabasePtr
DatabaseCatalog
::
getDatabase
(
const
UUID
&
uuid
)
const
{
std
::
lock_guard
lock
{
databases_mutex
};
auto
it
=
db_uuid_map
.
find
(
uuid
);
if
(
it
==
db_uuid_map
.
end
())
throw
Exception
(
ErrorCodes
::
UNKNOWN_DATABASE
,
"Database UUID {} does not exist"
,
toString
(
uuid
));
return
it
->
second
;
}
DatabasePtr
DatabaseCatalog
::
tryGetDatabase
(
const
UUID
&
uuid
)
const
{
assert
(
uuid
!=
UUIDHelpers
::
Nil
);
std
::
lock_guard
lock
{
databases_mutex
};
auto
it
=
db_uuid_map
.
find
(
uuid
);
if
(
it
==
db_uuid_map
.
end
())
return
{};
return
it
->
second
;
}
bool
DatabaseCatalog
::
isDatabaseExist
(
const
String
&
database_name
)
const
{
assert
(
!
database_name
.
empty
());
...
...
src/Interpreters/DatabaseCatalog.h
浏览文件 @
d1be5ec6
...
...
@@ -121,12 +121,14 @@ public:
DatabasePtr
getDatabaseForTemporaryTables
()
const
;
DatabasePtr
getSystemDatabase
()
const
;
void
attachDatabase
(
const
String
&
database_name
,
const
DatabasePtr
&
database
);
void
attachDatabase
(
const
String
&
database_name
,
const
UUID
&
uuid
,
const
DatabasePtr
&
database
);
DatabasePtr
detachDatabase
(
const
String
&
database_name
,
bool
drop
=
false
,
bool
check_empty
=
true
);
/// database_name must be not empty
DatabasePtr
getDatabase
(
const
String
&
database_name
)
const
;
DatabasePtr
tryGetDatabase
(
const
String
&
database_name
)
const
;
DatabasePtr
getDatabase
(
const
UUID
&
uuid
)
const
;
DatabasePtr
tryGetDatabase
(
const
UUID
&
uuid
)
const
;
bool
isDatabaseExist
(
const
String
&
database_name
)
const
;
Databases
getDatabases
()
const
;
...
...
@@ -211,6 +213,8 @@ private:
static
constexpr
size_t
reschedule_time_ms
=
100
;
private:
using
UUIDToDatabaseMap
=
std
::
unordered_map
<
UUID
,
DatabasePtr
>
;
/// For some reason Context is required to get Storage from Database object
Context
*
global_context
;
mutable
std
::
mutex
databases_mutex
;
...
...
@@ -218,6 +222,7 @@ private:
ViewDependencies
view_dependencies
;
Databases
databases
;
UUIDToDatabaseMap
db_uuid_map
;
UUIDToStorageMap
uuid_map
;
Poco
::
Logger
*
log
;
...
...
src/Interpreters/InterpreterCreateQuery.cpp
浏览文件 @
d1be5ec6
...
...
@@ -47,6 +47,7 @@
#include <Databases/DatabaseFactory.h>
#include <Databases/IDatabase.h>
#include <Databases/DatabaseOnDisk.h>
#include <Dictionaries/getDictionaryConfigurationFromAST.h>
...
...
@@ -87,6 +88,7 @@ InterpreterCreateQuery::InterpreterCreateQuery(const ASTPtr & query_ptr_, Contex
BlockIO
InterpreterCreateQuery
::
createDatabase
(
ASTCreateQuery
&
create
)
{
String
database_name
=
create
.
database
;
assert
(
database_name
!=
TABLE_WITH_UUID_NAME_PLACEHOLDER
);
auto
guard
=
DatabaseCatalog
::
instance
().
getDDLGuard
(
database_name
,
""
);
...
...
@@ -99,7 +101,26 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create)
throw
Exception
(
"Database "
+
database_name
+
" already exists."
,
ErrorCodes
::
DATABASE_ALREADY_EXISTS
);
}
if
(
!
create
.
storage
)
/// Will write file with database metadata, if needed.
String
database_name_escaped
=
escapeForFileName
(
database_name
);
fs
::
path
metadata_path
=
fs
::
canonical
(
context
.
getPath
());
fs
::
path
metadata_file_tmp_path
=
metadata_path
/
"metadata"
/
(
database_name_escaped
+
".sql.tmp"
);
fs
::
path
metadata_file_path
=
metadata_path
/
"metadata"
/
(
database_name_escaped
+
".sql"
);
if
(
!
create
.
storage
&&
create
.
attach
)
{
if
(
!
fs
::
exists
(
metadata_file_path
))
throw
Exception
(
"Database engine must be specified for ATTACH DATABASE query"
,
ErrorCodes
::
UNKNOWN_DATABASE_ENGINE
);
/// Short syntax: try read database definition from file
auto
ast
=
DatabaseOnDisk
::
parseQueryFromMetadata
(
nullptr
,
context
,
metadata_file_path
);
create
=
ast
->
as
<
ASTCreateQuery
&>
();
if
(
!
create
.
table
.
empty
()
||
!
create
.
storage
)
throw
Exception
(
ErrorCodes
::
INCORRECT_QUERY
,
"Metadata file {} contains incorrect CREATE DATABASE query"
,
metadata_file_path
);
create
.
attach
=
true
;
create
.
attach_short_syntax
=
true
;
}
else
if
(
!
create
.
storage
)
{
/// For new-style databases engine is explicitly specified in .sql
/// When attaching old-style database during server startup, we must always use Ordinary engine
...
...
@@ -120,12 +141,6 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create)
throw
Exception
(
"Unknown database engine: "
+
ostr
.
str
(),
ErrorCodes
::
UNKNOWN_DATABASE_ENGINE
);
}
/// Will write file with database metadata, if needed.
String
database_name_escaped
=
escapeForFileName
(
database_name
);
fs
::
path
metadata_path
=
fs
::
canonical
(
context
.
getPath
());
fs
::
path
metadata_file_tmp_path
=
metadata_path
/
"metadata"
/
(
database_name_escaped
+
".sql.tmp"
);
fs
::
path
metadata_file_path
=
metadata_path
/
"metadata"
/
(
database_name_escaped
+
".sql"
);
if
(
create
.
storage
->
engine
->
name
==
"Atomic"
)
{
if
(
!
context
.
getSettingsRef
().
allow_experimental_database_atomic
&&
!
internal
)
...
...
@@ -152,7 +167,8 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create)
metadata_path
=
metadata_path
/
"metadata"
/
database_name_escaped
;
}
DatabasePtr
database
=
DatabaseFactory
::
get
(
database_name
,
metadata_path
,
create
.
storage
,
create
.
uuid
,
context
);
// FIXME
DatabasePtr
database
=
DatabaseFactory
::
get
(
database_name
,
metadata_path
/
""
,
create
.
storage
,
create
.
uuid
,
context
);
bool
need_write_metadata
=
!
create
.
attach
||
!
fs
::
exists
(
metadata_file_path
);
...
...
@@ -181,7 +197,7 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create)
try
{
/// TODO Attach db only after it was loaded. Now it's not possible because of view dependencies
DatabaseCatalog
::
instance
().
attachDatabase
(
database_name
,
database
);
DatabaseCatalog
::
instance
().
attachDatabase
(
database_name
,
create
.
uuid
,
database
);
added
=
true
;
if
(
need_write_metadata
)
...
...
src/Interpreters/loadMetadata.cpp
浏览文件 @
d1be5ec6
...
...
@@ -156,7 +156,7 @@ void loadMetadataSystem(Context & context)
Poco
::
File
(
global_path
+
"metadata/"
SYSTEM_DATABASE
).
createDirectories
();
auto
system_database
=
std
::
make_shared
<
DatabaseOrdinary
>
(
SYSTEM_DATABASE
,
global_path
+
"metadata/"
SYSTEM_DATABASE
"/"
,
context
);
DatabaseCatalog
::
instance
().
attachDatabase
(
SYSTEM_DATABASE
,
system_database
);
DatabaseCatalog
::
instance
().
attachDatabase
(
SYSTEM_DATABASE
,
UUIDHelpers
::
Nil
,
system_database
);
}
}
...
...
src/Interpreters/tests/in_join_subqueries_preprocessor.cpp
浏览文件 @
d1be5ec6
...
...
@@ -1167,7 +1167,7 @@ TestResult check(const TestEntry & entry)
auto
storage_distributed_hits
=
StorageDistributedFake
::
create
(
"distant_db"
,
"distant_hits"
,
entry
.
shard_count
);
DB
::
DatabasePtr
database
=
std
::
make_shared
<
DB
::
DatabaseOrdinary
>
(
"test"
,
"./metadata/test/"
,
context
);
DB
::
DatabaseCatalog
::
instance
().
attachDatabase
(
"test"
,
database
);
DB
::
DatabaseCatalog
::
instance
().
attachDatabase
(
"test"
,
UUIDHelpers
::
Nil
,
database
);
database
->
attachTable
(
"visits_all"
,
storage_distributed_visits
);
database
->
attachTable
(
"hits_all"
,
storage_distributed_hits
);
context
.
setCurrentDatabase
(
"test"
);
...
...
src/Storages/tests/gtest_transform_query_for_external_database.cpp
浏览文件 @
d1be5ec6
...
...
@@ -42,7 +42,7 @@ private:
registerFunctions
();
DatabasePtr
database
=
std
::
make_shared
<
DatabaseMemory
>
(
"test"
,
context
);
database
->
attachTable
(
"table"
,
StorageMemory
::
create
(
StorageID
(
"test"
,
"table"
),
ColumnsDescription
{
columns
},
ConstraintsDescription
{}));
DatabaseCatalog
::
instance
().
attachDatabase
(
"test"
,
database
);
DatabaseCatalog
::
instance
().
attachDatabase
(
"test"
,
UUIDHelpers
::
Nil
,
database
);
context
.
setCurrentDatabase
(
"test"
);
}
};
...
...
tests/queries/0_stateless/01107_atomic_db_detach_attach.sh
浏览文件 @
d1be5ec6
...
...
@@ -18,7 +18,7 @@ wait
$CLICKHOUSE_CLIENT
-q
"ATTACH TABLE test_01107.mt"
$CLICKHOUSE_CLIENT
-q
"SELECT count(n), sum(n) FROM test_01107.mt"
$CLICKHOUSE_CLIENT
-q
"DETACH DATABASE test_01107"
$CLICKHOUSE_CLIENT
--allow_experimental_database_atomic
=
1
-q
"ATTACH DATABASE test_01107
ENGINE=Atomic
"
$CLICKHOUSE_CLIENT
--allow_experimental_database_atomic
=
1
-q
"ATTACH DATABASE test_01107"
$CLICKHOUSE_CLIENT
-q
"SELECT count(n), sum(n) FROM test_01107.mt"
$CLICKHOUSE_CLIENT
-q
"INSERT INTO test_01107.mt SELECT number + sleepEachRow(1) FROM numbers(5)"
&&
echo
"end"
&
...
...
tests/queries/0_stateless/01114_database_atomic.sh
浏览文件 @
d1be5ec6
...
...
@@ -12,8 +12,8 @@ $CLICKHOUSE_CLIENT --allow_experimental_database_atomic=1 -q "CREATE DATABASE te
$CLICKHOUSE_CLIENT
--default_database_engine
=
Atomic
--allow_experimental_database_atomic
=
1
-q
"CREATE DATABASE test_01114_2"
$CLICKHOUSE_CLIENT
--default_database_engine
=
Ordinary
-q
"CREATE DATABASE test_01114_3"
$CLICKHOUSE_CLIENT
-q
"SHOW CREATE DATABASE test_01114_1"
$CLICKHOUSE_CLIENT
-q
"SHOW CREATE DATABASE test_01114_2"
$CLICKHOUSE_CLIENT
-
-show_table_uuid_in_table_create_query_if_not_nil
=
0
-
q
"SHOW CREATE DATABASE test_01114_1"
$CLICKHOUSE_CLIENT
-
-show_table_uuid_in_table_create_query_if_not_nil
=
0
-
q
"SHOW CREATE DATABASE test_01114_2"
$CLICKHOUSE_CLIENT
-q
"SHOW CREATE DATABASE test_01114_3"
$CLICKHOUSE_CLIENT
-q
"SELECT name, engine, splitByChar('/', data_path)[-2], splitByChar('/', metadata_path)[-3], splitByChar('/', metadata_path)[-2] FROM system.databases WHERE name LIKE 'test_01114_%'"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录