content/influxdb3/cloud-dedicated/admin/databases/create.md
Use the Admin UI, the influxctl CLI,
or the Management HTTP API to create a database in your {{< product-name omit=" Clustered" >}} cluster.
You can create a database with an optional retention period and custom partitioning.
{{< tabs-wrapper >}} {{% tabs %}} Admin UI influxctl Management API {{% /tabs %}}
{{% tab-content %}}
<!------------------------------- BEGIN ADMIN UI ------------------------------>Open the {{< product-name >}} Admin UI at
<pre> <a href="https://console.influxdata.com">https://console.influxdata.com</a> </pre>Use the credentials provided by InfluxData to log into the Admin UI. If you don't have login credentials, contact InfluxData support.
In the cluster list, find and click the cluster you want to create a database in. You can sort on column headers or use the Search field to find a specific cluster.
Click the New Database button above the database list. The Create Database dialog displays.
{{< img-hd src="/img/influxdb3/cloud-dedicated-admin-ui-create-database.png" alt="Create database dialog" />}}
In the Create Database dialog, provide the following information:
Click the Create Database button to create the database. The new database displays in the list of databases for the cluster. {{% /tab-content %}}
{{% tab-content %}}
<!------------------------------- BEGIN INFLUXCTL ----------------------------->If you haven't already, download and install the influxctl CLI, and then configure an influxctl connection profile for your cluster.
Run the influxctl database create command:
{{% code-placeholders "DATABASE_NAME|30d" %}}
influxctl database create \
--retention-period 30d \
DATABASE_NAME
{{% /code-placeholders %}}
Replace {{% code-placeholder-key %}}DATABASE_NAME{{% /code-placeholder-key %}} with your desired database name.
{{% /tab-content %}}
{{% tab-content %}}
<!------------------------------- BEGIN MANAGEMENT API ----------------------->This example uses cURL to send a Management HTTP API request, but you can use any HTTP client.
{{% api-endpoint method="POST" endpoint="https://console.influxdata.com/api/v0/accounts/ACCOUNT_ID/clusters/CLUSTER_ID/databases" api-ref="/influxdb3/cloud-dedicated/api/management/#operation/CreateClusterDatabase" %}}
{{% code-placeholders "ACCOUNT_ID|CLUSTER_ID|MANAGEMENT_TOKEN|DATABASE_NAME" %}}
curl \
--location "https://console.influxdata.com/api/v0/accounts/ACCOUNT_ID/clusters/CLUSTER_ID/databases" \
--header "Authorization: Bearer MANAGEMENT_TOKEN" \
--json '{
"name": "DATABASE_NAME"
}'
{{% /code-placeholders %}}
Replace the following:
ACCOUNT_ID{{% /code-placeholder-key %}}: the account ID for the cluster (list details via the Admin UI or CLI)CLUSTER_ID{{% /code-placeholder-key %}}: the cluster ID (list details via the Admin UI or CLI).MANAGEMENT_TOKEN{{% /code-placeholder-key %}}: a valid management token for your {{% product-name %}} clusterDATABASE_NAME{{% /code-placeholder-key %}}: name for the new database
{{% /tab-content %}}
{{< /tabs-wrapper >}}Partitioning defaults to %Y-%m-%d (daily).
{{< product-name >}} lets you define a custom partitioning strategy for each database and table. A partition is a logical grouping of data stored in Apache Parquet By default, data is partitioned by day, but, depending on your schema and workload, customizing the partitioning strategy can improve query performance.
To use custom partitioning, you define a partition template. If a table doesn't have a custom partition template, it inherits the database's template.
{{< tabs-wrapper >}} {{% tabs %}} influxctl Management API {{% /tabs %}} {{% tab-content %}}
<!------------------------------- BEGIN INFLUXCTL CUSTOM ------------------->If you haven't already, download and install the influxctl CLI.
Use the following influxctl database create command flags to specify the
partition template parts:
--template-timeformat: A Rust strftime date and time
string that specifies the time part in the partition template and determines
the time interval to partition by.
Use one of the following:
%Y-%m-%d (daily)%Y-%m (monthly)%Y (annually)--template-tag: An [InfluxDB tag]
to use in the partition template.
--template-tag-bucket: An InfluxDB tag
and number of "buckets" to group tag values into.
Provide the tag key and the number of buckets to bucket tag values into
separated by a comma: tagKey,N.
{{% code-placeholders "DATABASE_NAME|30d|(TAG_KEY(_\d)?)|100|300" %}}
influxctl database create \
--retention-period 30d \
--template-tag TAG_KEY_1 \
--template-tag TAG_KEY_2 \
--template-tag-bucket TAG_KEY_3,100 \
--template-tag-bucket TAG_KEY_4,300 \
--template-timeformat '%Y-%m-%d' \
DATABASE_NAME
{{% /code-placeholders %}}
Replace the following:
DATABASE_NAME{{% /code-placeholder-key %}}: the name of the database to createTAG_KEY_1, TAG_KEY_2{{% /code-placeholder-key %}}: tag keys to partition byTAG_KEY_3, TAG_KEY_4{{% /code-placeholder-key %}}: tag keys for bucketed partitioning100, 300{{% /code-placeholder-key %}}: number of buckets to group tag values into'%Y-%m-%d'{{% /code-placeholder-key %}}: Rust strftime date and time string that specifies the time part in the partition template
{{% /tab-content %}}
{{% tab-content %}}This example uses cURL to send a Management HTTP API request, but you can use any HTTP client.
{{% api-endpoint method="POST" endpoint="https://console.influxdata.com/api/v0/accounts/ACCOUNT_ID/clusters/CLUSTER_ID/databases" api-ref="/influxdb3/cloud-dedicated/api/management/#operation/CreateClusterDatabase" %}}
In the request body, include the partitionTemplate property and specify the partition template parts as an array of objects--for example:
{{% code-placeholders "ACCOUNT_ID|CLUSTER_ID|DATABASE_NAME|MANAGEMENT_TOKEN|(TAG_KEY(_\d)?)|100|300|%Y-%m-%d" %}}
curl \
--location "https://console.influxdata.com/api/v0/accounts/ACCOUNT_ID/clusters/CLUSTER_ID/databases" \
--header "Authorization: Bearer MANAGEMENT_TOKEN" \
--json '{
"name": "DATABASE_NAME",
"maxTables": 500,
"maxColumnsPerTable": 250,
"retentionPeriod": 2592000000000,
"partitionTemplate": [
{ "type": "tag", "value": "TAG_KEY_1" },
{ "type": "tag", "value": "TAG_KEY_2" },
{ "type": "bucket", "value": { "tagName": "TAG_KEY_3", "numberOfBuckets": 100 } },
{ "type": "bucket", "value": { "tagName": "TAG_KEY_4", "numberOfBuckets": 300 } },
{ "type": "time", "value": "%Y-%m-%d" }
]
}'
{{% /code-placeholders %}}
Replace the following:
ACCOUNT_ID{{% /code-placeholder-key %}}: the account ID for the cluster (list details via the Admin UI or CLI)CLUSTER_ID{{% /code-placeholder-key %}}: the cluster ID (list details via the Admin UI or CLI).MANAGEMENT_TOKEN{{% /code-placeholder-key %}}: a valid management token for your {{% product-name %}} clusterDATABASE_NAME{{% /code-placeholder-key %}}: name for the new databaseTAG_KEY_1, TAG_KEY_2{{% /code-placeholder-key %}}: tag keys to partition byTAG_KEY_3, TAG_KEY_4{{% /code-placeholder-key %}}: tag keys for bucketed partitioning100, 300{{% /code-placeholder-key %}}: number of buckets to group tag values into'%Y-%m-%d'{{% /code-placeholder-key %}}: Rust strftime date and time string that specifies the time part in the partition template{{% /tab-content %}} {{< /tabs-wrapper >}}
Always specify 1 time part in your template. A template has a maximum of 8 parts: 1 time part and up to 7 total tag and tag bucket parts.
For more information about partition template requirements and restrictions, see Partition templates.
[!Warning]
Partition templates can only be applied on create
You can only apply a partition template when creating a database. You can't update a partition template on an existing database.
Specify how long InfluxDB retains data before automatically removing it.
{{< tabs-wrapper >}} {{% tabs %}} influxctl CLI Management API {{% /tabs %}}
{{% tab-content %}}
Use the --retention-period flag to define the retention period as a duration.
For example, 30d means 30 days. A zero duration (0d) keeps data indefinitely.
{{< flex >}} {{% flex-content "half" %}}
{{% flex-content "half" %}}
0d: infinite/none3d: 3 days6w: 6 weeks1mo: 1 month (30 days)1y: 1 year
{{% /flex-content %}}
{{< /flex >}}
{{% /tab-content %}}{{% tab-content %}}
Use the retentionPeriod property to specify the retention period as nanoseconds.
For example, 2592000000000 means 30 days. A value of 0 keeps data indefinitely.
0: infinite/none259200000000000: 3 days2592000000000000: 30 days31536000000000000: 1 standard year (365 days)
{{% /tab-content %}}
{{< /tabs-wrapper >}}Database names must adhere to the following naming restrictions:
_), dash (-), and forward-slash (/)_)[!Caution]
Underscore prefix reserved for system use
Names starting with an underscore (
_) may be reserved for InfluxDB system use. While {{% product-name %}} might not explicitly reject these names, using them risks conflicts with current or future system features and may result in unexpected behavior or data loss.
mydb
sensor_data
prod-metrics
logs/application
webserver123
my database # Contains whitespace
sensor.data # Contains period
app@server # Contains special character
_internal # Starts with underscore (reserved)
very_long_database_name_that_exceeds_sixty_four_character_limit # Too long
For comprehensive information about naming restrictions for all InfluxDB identifiers, see Naming restrictions and conventions.
In InfluxDB 1.x, data is stored in databases and retention policies. In {{% product-name %}}, databases and retention policies have been merged into databases, where databases have a retention period, but retention policies are no longer part of the data model.
Because InfluxQL uses the 1.x data model, a database must be mapped to a v1 database and retention policy (DBRP) to be queryable with InfluxQL.
When naming a database that you want to query with InfluxQL, use the following naming convention to automatically map v1 DBRP combinations to an {{% product-name %}} database:
database_name/retention_policy_name
| v1 Database name | v1 Retention Policy name | New database name |
|---|---|---|
| db | rp | db/rp |
| telegraf | autogen | telegraf/autogen |
| webmetrics | 1w-downsampled | webmetrics/1w-downsampled |
In {{< product-name >}}, table (measurement) and column limits can be configured using the following options:
| Description | Default | influxctl CLI flag | Management API property |
|---|---|---|---|
| Table limit | 500 | --max-tables | maxTables |
| Column limit | 250 | --max-columns | maxColumnsPerTable |
Default maximum number of tables: 500
Each measurement is represented by a table in a database. Your database's table limit can be raised beyond the default limit of 500. InfluxData has production examples of clusters with 20,000+ active tables across multiple databases.
[!Warning]
Excessive table counts can impact performance and stability
High table counts, especially those concurrently receiving writes and queries, can increase catalog overhead which can affect performance and stability. What constitutes "excessive" depends on multiple factors such as query latency requirements, write bandwidth, and cluster capacity to handle rapid backfills. If you're considering more than doubling the default limit, test your configuration thoroughly.
Increasing your table limit affects your {{% product-name omit=" Clustered" %}} cluster in the following ways:
{{< expand-wrapper >}} {{% expand "May improve query performance <em style='opacity:.5;font-weight:normal;'>View more info</em>" %}} Schemas with many measurements that contain focused sets of tags and fields can make it easier for the query engine to identify what partitions contain the queried data, resulting in better query performance. {{% /expand %}}
{{% expand "More PUTs into object storage <em style='opacity:.5;font-weight:normal;'>View more info</em>" %}}
By default, {{< product-name >}} partitions
data by measurement and time range and stores each partition as a Parquet
file in your cluster's object store. By increasing the number of measurements
(tables) you can store in your database, you also increase the potential for
more PUT requests into your object store as InfluxDB creates more partitions.
Each PUT request incurs a monetary cost and will increase the operating cost of
your cluster.
{{% /expand %}}
{{% expand "More work for the compactor <em style='opacity:.5;font-weight:normal;'>View more info</em>" %}} To optimize storage over time, your {{< product-name omit=" Clustered" >}} cluster contains a compactor that routinely compacts Parquet files in object storage. With more tables and partitions to compact, the compactor may need to be scaled (either vertically or horizontally) to keep up with demand, adding to the operating cost of your cluster. {{% /expand %}} {{< /expand-wrapper >}}
Default maximum number of columns: 250
Time, fields, and tags are each represented by a column in a table. Increasing your column limit affects your {{% product-name omit=" Clustered" %}} cluster in the following ways:
{{< expand-wrapper >}} {{% expand "May adversely affect query performance" %}} At query time, the InfluxDB query engine identifies what table contains the queried data and then evaluates each row in the table to match the conditions of the query. The more columns that are in each row, the longer it takes to evaluate each row.
Through performance testing, InfluxData has identified 250 columns as the threshold beyond which query performance may be affected (depending on the shape of and data types in your schema). {{% /expand %}} {{< /expand-wrapper >}}