PostgreSQL 从源码找出哪些操作需要超级用户权限 - 阿里云rds_superuser和superuser有什么区别

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 标签 PostgreSQL , 超级用户 , superuser 背景 在数据库中哪些操作需要超级用户的权限才能执行? 这个问题翻文档可能翻不全面,或者是已经比较难以完成的任务。 但是从源码里面是比较好找出这个答案的。 权限 例如 postgres=# select * from pg_authid; rolname | rolsuper | rolin

标签

PostgreSQL , 超级用户 , superuser


背景

在数据库中哪些操作需要超级用户的权限才能执行?

这个问题翻文档可能翻不全面,或者是已经比较难以完成的任务。

但是从源码里面是比较好找出这个答案的。

权限

例如

postgres=# select * from pg_authid;
      rolname      | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil 
-------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+---------------
 postgres          | t        | t          | t             | t           | t           | t              | t            |           -1 |             | 
 pg_signal_backend | f        | t          | f             | f           | f           | f              | f            |           -1 |             | 
 test              | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
 dba               | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
 test1             | f        | t          | f             | f           | f           | f              | f            |           -1 |             | 
 digoal            | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
 a                 | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
 b                 | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
(8 rows)

rolsuper 就表示是否具备超级用户权限。

代码中如何判断超级用户

src/backend/utils/misc/superuser.c

/*
 * The Postgres user running this command has Postgres superuser privileges
 */
bool
superuser(void)
{
        return superuser_arg(GetUserId());
}

/*
 * The specified role has Postgres superuser privileges
 */
bool
superuser_arg(Oid roleid)
{
        bool            result;
        HeapTuple       rtup;

        /* Quick out for cache hit */
        if (OidIsValid(last_roleid) && last_roleid == roleid)
                return last_roleid_is_super;

        /* Special escape path in case you deleted all your users. */
        if (!IsUnderPostmaster && roleid == BOOTSTRAP_SUPERUSERID)
                return true;

        /* OK, look up the information in pg_authid */
        rtup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
        if (HeapTupleIsValid(rtup))
        {
                result = ((Form_pg_authid) GETSTRUCT(rtup))->rolsuper;  // 最终还是读取pg_authid中的rolsuper字段  
                ReleaseSysCache(rtup);
        }
        else
        {
                /* Report "not superuser" for invalid roleids */
                result = false;
        }

        /* If first time through, set up callback for cache flushes */
        if (!roleid_callback_registered)
        {
                CacheRegisterSyscacheCallback(AUTHOID,
                                                                          RoleidCallback,
                                                                          (Datum) 0);
                roleid_callback_registered = true;
        }

        /* Cache the result for next time */
        last_roleid = roleid;
        last_roleid_is_super = result;

        return result;
}

在PostgreSQL代码里面,通过FormData_pg_authid结构来表示pg_authid的表结构

CATALOG(pg_authid,1260) BKI_SHARED_RELATION BKI_ROWTYPE_OID(2842) BKI_SCHEMA_MACRO
{
    NameData    rolname;        /* name of role */
    bool        rolsuper;       /* read this field via superuser() only! */
    bool        rolinherit;     /* inherit privileges from other roles? */
    bool        rolcreaterole;  /* allowed to create more roles? */
    bool        rolcreatedb;    /* allowed to create databases? */
    bool        rolcatupdate;   /* allowed to alter catalogs manually? */
    bool        rolcanlogin;    /* allowed to log in as session user? */
    bool        rolreplication; /* role used for streaming replication */
    int32       rolconnlimit;   /* max connections allowed (-1=no limit) */

    /* remaining fields may be null; use heap_getattr to read them! */
    text        rolpassword;    /* password, if any */
    timestamptz rolvaliduntil;  /* password expiration time, if any */
} FormData_pg_authid;

#undef timestamptz


/* ----------------
 *      Form_pg_authid corresponds to a pointer to a tuple with
 *      the format of pg_authid relation.
 * ----------------
 */
typedef FormData_pg_authid *Form_pg_authid;

代码中如何判断用户是否有replication的权限

以此类推,

src/backend/utils/init/miscinit.c

/*
 * Check whether specified role has explicit REPLICATION privilege
 */
bool
has_rolreplication(Oid roleid)
{
        bool            result = false;
        HeapTuple       utup;

        utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
        if (HeapTupleIsValid(utup))
        {
                result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
                ReleaseSysCache(utup);
        }
        return result;
}

人肉时间, 找出需要判断超级用户的地方

grep -r "superuser()" *

contrib/file_fdw/file_fdw.c:    if (catalog == ForeignTableRelationId && !superuser())
contrib/dblink/dblink.c:        if (!superuser())
contrib/dblink/dblink.c:        if (!superuser())
contrib/pgstattuple/pgstatindex.c:      if (!superuser())
contrib/pgstattuple/pgstatindex.c:      if (!superuser())
contrib/pgstattuple/pgstatindex.c:      if (!superuser())
contrib/pgstattuple/pgstatindex.c:      if (!superuser())
contrib/pgstattuple/pgstatindex.c:      if (!superuser())
contrib/pgstattuple/pgstattuple.c:      if (!superuser())
contrib/pgstattuple/pgstattuple.c:      if (!superuser())
contrib/pgstattuple/pgstatapprox.c:     if (!superuser())
contrib/pg_stat_statements/pg_stat_statements.c:        bool            is_superuser = superuser();
contrib/sepgsql/label.c:        if (!superuser())
contrib/pageinspect/brinfuncs.c:        if (!superuser())
contrib/pageinspect/brinfuncs.c:        if (!superuser())
contrib/pageinspect/brinfuncs.c:        if (!superuser())
contrib/pageinspect/brinfuncs.c:        if (!superuser())
contrib/pageinspect/fsmfuncs.c: if (!superuser())
contrib/pageinspect/ginfuncs.c: if (!superuser())
contrib/pageinspect/ginfuncs.c: if (!superuser())
contrib/pageinspect/ginfuncs.c: if (!superuser())
contrib/pageinspect/heapfuncs.c:        if (!superuser())
contrib/pageinspect/heapfuncs.c:        if (!superuser())
contrib/pageinspect/btreefuncs.c:       if (!superuser())
contrib/pageinspect/btreefuncs.c:       if (!superuser())
contrib/pageinspect/btreefuncs.c:       if (!superuser())
contrib/pageinspect/rawpage.c:  if (!superuser())
contrib/pageinspect/rawpage.c:  if (!superuser())
contrib/adminpack/adminpack.c:  if (!superuser())
contrib/adminpack/adminpack.c:  if (!superuser())
contrib/postgres_fdw/connection.c:              if (!superuser() && !PQconnectionUsedPassword(conn))
contrib/postgres_fdw/connection.c:      if (superuser())
src/include/catalog/pg_authid.h:        bool            rolsuper;               /* read this field via superuser() only! */
src/test/modules/dummy_seclabel/dummy_seclabel.c:               if (!superuser())
src/test/regress/regress.c:     if (!superuser())
src/test/regress/regress.c:     if (!superuser())
src/backend/commands/copy.c:    if (!pipe && !superuser())
src/backend/commands/trigger.c:                 if (!superuser())
src/backend/commands/dbcommands.c:                (encoding == PG_SQL_ASCII && superuser())))
src/backend/commands/dbcommands.c:                (encoding == PG_SQL_ASCII && superuser())))
src/backend/commands/dbcommands.c:      if (superuser())
src/backend/commands/opclasscmds.c:     if (!superuser())
src/backend/commands/opclasscmds.c:     if (!superuser())
src/backend/commands/opclasscmds.c:     if (!superuser())
src/backend/commands/tablespace.c:      if (!superuser())
src/backend/commands/event_trigger.c:   if (!superuser())
src/backend/commands/foreigncmds.c:     if (!superuser())
src/backend/commands/foreigncmds.c:             if (!superuser())
src/backend/commands/foreigncmds.c:     if (!superuser())
src/backend/commands/foreigncmds.c:     if (!superuser())
src/backend/commands/tsearchcmds.c:     if (!superuser())
src/backend/commands/tsearchcmds.c:     if (!superuser())
src/backend/commands/amcmds.c:  if (!superuser())
src/backend/commands/amcmds.c:  if (!superuser())
src/backend/commands/functioncmds.c:            if (!superuser())
src/backend/commands/functioncmds.c:    if (isLeakProof && !superuser())
src/backend/commands/functioncmds.c:            if (procForm->proleakproof && !superuser())
src/backend/commands/functioncmds.c:            if (!superuser())
src/backend/commands/functioncmds.c:            if (!superuser())
src/backend/commands/tablecmds.c:                       if (!superuser())
src/backend/commands/extension.c:       if (control->superuser && !superuser())
src/backend/commands/aggregatecmds.c:           if (transTypeId == INTERNALOID && superuser())
src/backend/commands/aggregatecmds.c:                   if (mtransTypeId == INTERNALOID && superuser())
src/backend/commands/alter.c:   if (!superuser())
src/backend/commands/alter.c:   if (!superuser())
src/backend/commands/alter.c:           if (!superuser())
src/backend/commands/proclang.c:                if (!superuser())
src/backend/commands/proclang.c:                if (!superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:                    if (!superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:                    !superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/user.c:    if (grantorId != GetUserId() && !superuser())
src/backend/commands/user.c:            if (!superuser())
src/backend/commands/typecmds.c:        if (!superuser())
src/backend/commands/typecmds.c:                if (!superuser())
src/backend/libpq/be-fsstubs.c: if (!superuser())
src/backend/libpq/be-fsstubs.c: if (!superuser())
src/backend/catalog/system_views.sql:-- than use explicit 'superuser()' checks in those functions, we use the GRANT
src/backend/catalog/pg_proc.c:                                                          (superuser() ? PGC_SUSET : PGC_USERSET),
src/backend/tcop/utility.c:                             load_file(stmt->filename, !superuser());
src/backend/tcop/utility.c:                     if (!superuser())
src/backend/postmaster/pgstat.c:                        if (checkUser && !superuser() && beentry->st_userid != GetUserId())
src/backend/replication/slotfuncs.c:    if (!superuser() && !has_rolreplication(GetUserId()))
src/backend/replication/walreceiver.c:  if (!superuser())
src/backend/replication/walsender.c:            if (!superuser())
src/backend/replication/logical/origin.c:       if (!superuser())
src/backend/replication/logical/logicalfuncs.c: if (!superuser() && !has_rolreplication(GetUserId()))
src/backend/utils/fmgr/fmgr.c:                                          (superuser() ? PGC_SUSET : PGC_USERSET),
src/backend/utils/misc/guc.c:           !superuser())
src/backend/utils/misc/guc.c:   if ((record->flags & GUC_SUPERUSER_ONLY) && !superuser())
src/backend/utils/misc/guc.c:   if (!superuser())
src/backend/utils/misc/guc.c:                                                                    (superuser() ? PGC_SUSET : PGC_USERSET),
src/backend/utils/misc/guc.c:                                                                    (superuser() ? PGC_SUSET : PGC_USERSET),
src/backend/utils/misc/guc.c:                                                    (superuser() ? PGC_SUSET : PGC_USERSET),
src/backend/utils/misc/guc.c:                                                    (superuser() ? PGC_SUSET : PGC_USERSET),
src/backend/utils/misc/guc.c:   bool            am_superuser = superuser();
src/backend/utils/misc/guc.c:   if ((record->flags & GUC_SUPERUSER_ONLY) && !superuser())
src/backend/utils/misc/guc.c:                   ((conf->flags & GUC_SUPERUSER_ONLY) && !superuser()))
src/backend/utils/misc/guc.c:   if (conf->source == PGC_S_FILE && superuser())
src/backend/utils/misc/guc.c:   if (superuser())
src/backend/utils/misc/guc.c:           if (superuser())
src/backend/utils/misc/guc.c:   else if (gconf->context == PGC_SUSET && superuser())
src/backend/utils/misc/guc.c:                                                    superuser() ? PGC_SUSET : PGC_USERSET,
src/backend/utils/misc/superuser.c: *     The superuser() function.  Determines if user has superuser privilege.
src/backend/utils/init/postinit.c:                      am_superuser = superuser();
src/backend/utils/init/postinit.c:              am_superuser = superuser();
src/backend/utils/init/postinit.c:              if (!superuser() && !has_rolreplication(GetUserId()))
src/backend/utils/adt/misc.c:   if (superuser_arg(proc->roleId) && !superuser())
src/backend/utils/adt/genfile.c:        if (!superuser())
src/backend/utils/adt/genfile.c:        if (!superuser())
src/backend/utils/adt/genfile.c:        if (!superuser())
src/backend/utils/adt/genfile.c:        if (!superuser())
src/bin/psql/prompt.c:                                  if (is_superuser())

去代码里面看吧,举一些例子

例子

1. 只有超级用户可以修改或设置file_fdw foreign table的options

contrib/file_fdw/file_fdw.c

        if (catalog == ForeignTableRelationId && !superuser())
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("only superuser can change options of a file_fdw foreign table")));

2. 只有超级用户能读取数据库所在服务器的文件

src/backend/utils/adt/genfile.c

Datum
pg_read_file(PG_FUNCTION_ARGS)
{
...
        if (!superuser())
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 (errmsg("must be superuser to read files"))));

Datum
pg_read_binary_file(PG_FUNCTION_ARGS)
{
...

        if (!superuser())
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 (errmsg("must be superuser to read files"))));

3. 只有超级用户可以查看需要超级用户权限才能查看的参数

src/include/utils/guc.h

/*
 * bit values in "flags" of a GUC variable
 */
#define GUC_LIST_INPUT                  0x0001  /* input can be list format */
#define GUC_LIST_QUOTE                  0x0002  /* double-quote list elements */
#define GUC_NO_SHOW_ALL                 0x0004  /* exclude from SHOW ALL */
#define GUC_NO_RESET_ALL                0x0008  /* exclude from RESET ALL */
#define GUC_REPORT                              0x0010  /* auto-report changes to client */
#define GUC_NOT_IN_SAMPLE               0x0020  /* not in postgresql.conf.sample */
#define GUC_DISALLOW_IN_FILE    0x0040  /* can't set in postgresql.conf */
#define GUC_CUSTOM_PLACEHOLDER  0x0080  /* placeholder for custom variable */
#define GUC_SUPERUSER_ONLY              0x0100  /* show only to superusers */
#define GUC_IS_NAME                             0x0200  /* limit string to NAMEDATALEN-1 */
#define GUC_NOT_WHILE_SEC_REST  0x0400  /* can't set if security restricted */
#define GUC_DISALLOW_IN_AUTO_FILE 0x0800                /* can't set in

src/backend/utils/misc/guc.c

        if (restrict_superuser &&
                (record->flags & GUC_SUPERUSER_ONLY) &&
                !superuser())
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("must be superuser to examine \"%s\"", name)));
...

4. 只有超级用户能执行alter system

src/backend/utils/misc/guc.c

        if (!superuser())
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                         (errmsg("must be superuser to execute ALTER SYSTEM command"))));

5. 只有超级用户能创建language

src/backend/commands/proclang.c

                /*
                 * Check permission
                 */
                if (!superuser())
                {
                        if (!pltemplate->tmpldbacreate)
                                ereport(ERROR,
                                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                                 errmsg("must be superuser to create procedural language \"%s\"",
                                                                stmt->plname)));
                        if (!pg_database_ownercheck(MyDatabaseId, GetUserId()))
                                aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_DATABASE,
                                                           get_database_name(MyDatabaseId));
                }

如果你发现报错中包含了权限错误的问题,也可以使用这个方法找到对应的代码。

\set VERBOSITY verbose

test=> \set VERBOSITY verbose
test=> create role b replication;
ERROR:  42501: must be superuser to create replication users
LOCATION:  CreateRole, user.c:319

对应的代码在user.c的319行, CreateRole函数中.  

就举这些例子,其他的可以自己看一下。

阿里云rds_superuser和superuser有什么区别

为了维护便利,阿里云RDS PostgreSQL开放了一个权限名为rds_superuser给用户,比superuser少一些权限,主要是文件操作相关的,并且不能越权做superuser能做的事情。

相比普通用户,rds_superuser多了以下权限。

-- 创建插件
create extension ?;  

-- 创建非superuser,repliction权限用户
create role ?;  

-- 非supuer owned对象的操作
alter table test.test rename to test1;
alter table test.test1 owner to test_rdssuper;
alter table test.test1 rename to test;
alter table test.test owner to test_norm;

-- SET SESSION AUTHORIZATION、SET ROLE可以set非superuser用户
set role to test_norm;
reset role;

-- 所有对象的vacuum、analyze操作
vacuum pg_class;
analyze pg_class;

-- pg_stat_reset (pgstat_reset_counters) pg_stat_reset_shared(pgstat_reset_shared_counters)
select pg_stat_reset();
select pg_stat_reset_shared('bgwriter');

-- pgstat_reset_single_counter
select pg_stat_reset_single_table_counters('test.test'::regclass::oid);
select pg_stat_reset_single_function_counters('pg_stat_get_activity'::regproc::oid);

-- pg_stat_get_activity pg_stat_get_backend_activity pg_stat_get_backend_waiting pg_stat_get_backend_activity_start pg_stat_get_backend_xact_start pg_stat_get_backend_start pg_stat_get_backend_client_addr pg_stat_get_backend_client_port

-- select pg_stat_get_activity()
SELECT pg_stat_get_backend_pid(s.backendid) AS pid, pg_stat_get_backend_activity(s.backendid) AS query,pg_stat_get_backend_waiting(s.backendid) AS waiting, pg_stat_get_backend_xact_start(s.backendid) AS xact_start, pg_stat_get_backend_start(s.backendid) AS bd_start, pg_stat_get_backend_client_addr(s.backendid) AS ip, pg_stat_get_backend_client_port(s.backendid) AS port FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;

-- pgstatindex pgstatindexbyid pgstatginindex pg_relpages pg_relpagesbyid pgstattuple 
create extension pgstattuple; 
SELECT * FROM pgstattuple('pg_catalog.pg_proc'); 
SELECT * FROM pgstatindex('pg_cast_oid_index'); 
SELECT * FROM pgstatginindex('test_gin_index'); 

-- pg_stat_statments

-- 中文分词相关
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;

-- finish prepared transaction,提交或回滚两阶段提交的事务
\c - test_norm
begin;
insert into test.test values(2);
prepare transaction 't1';
\c - test_rdssuper
select * from pg_prepared_xacts ;
commit prepared 't1';

-- alter type owner
\c - test_norm
CREATE TYPE compfoo AS (f1 int, f2 text); 
\c - test_rdssuper
alter type compfoo owner to test_rdssuper; 

-- 允许rds_superuser用户设置session_preload_libraries,以便于用户使用pg_hint_plan等
alter role all set session_preload_libraries = 'pg_hint_plan';
alter role all set set pg_hint_plan.debug_print = on;
\c - superuser
/*+ SeqScan(test.test) */ select * from test.test;
\c - test_rdssuper
/*+ SeqScan(test.test) */ select * from test.test;

-- 支持设置session_preload_libraries,设置的值必须是rds_available_extensions里面的插件
alter role all set session_preload_libraries = 'plperlu';  -- ERROR: invalid value for parameter "session_preload_libraries": "plperlu"
alter role all set session_preload_libraries = 'plperl,postgis';

-- grant role to
grant test_norm to test_rdssuper;

-- revoke role from
revoke test_norm from test_rdssuper;

-- rds_superuser可以set
SET SESSION AUTHORIZATION ?;

-- 允许rds_superuser通过dblink连接本地数据库,不需要配置port,host,ip,只需要指定dbname

-- 支持oss_fdw

-- 创建RDS实例时的超级用户自带了replication角色,允许用来做流复制

-- 允许rds_superuser设置temp_file_limit参数

-- 允许rds_superuser修改schema
grant all on schema test to test_another;
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
21天前
|
关系型数据库 分布式数据库 数据库
成都晨云信息技术完成阿里云PolarDB数据库产品生态集成认证
近日,成都晨云信息技术有限责任公司(以下简称晨云信息)与阿里云PolarDB PostgreSQL版数据库产品展开产品集成认证。测试结果表明,晨云信息旗下晨云-站群管理系统(V1.0)与阿里云以下产品:开源云原生数据库PolarDB PostgreSQL版(V11),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
28天前
|
存储 分布式计算 网络协议
阿里云服务器内存型r7、r8a、r8y实例区别参考
在阿里云目前的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y这几个实例规格,相比于活动内的经济型e、通用算力型u1实例来说,这些实例规格等性能更强,与计算型和通用型相比,它的内存更大,因此这些内存型实例规格主要适用于数据库、中间件和数据分析与挖掘,Hadoop、Spark集群等场景,本文为大家介绍内存型r7、r8a、r8y实例区别及最新活动价格,以供参考。
阿里云服务器内存型r7、r8a、r8y实例区别参考
|
28天前
|
机器学习/深度学习 编解码 人工智能
阿里云Stable Diffusion操作教程
阿里云Stable Diffusion操作教程
190 0
|
26天前
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
366 3
|
7天前
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
21 0
|
10天前
|
存储 关系型数据库 MySQL
深入理解MySQL中varchar和text的区别
在MySQL中,varchar和text都是用于存储文本数据的数据类型。varchar是可变长度字符串,存储时按实际长度分配空间,适合存储较短的、长度可变的字符串,如用户名。text类型用于存储大量文本,始终占用足够空间,适合文章内容。varchar在存储和查询时可能更快,可被索引,而text需特殊搜索技术。在数据库设计时,应根据存储需求和性能平衡选择。
38 0
|
17天前
|
消息中间件 NoSQL Kafka
云原生最佳实践系列 5:基于函数计算 FC 实现阿里云 Kafka 消息内容控制 MongoDB DML 操作
该方案描述了一个大数据ETL流程,其中阿里云Kafka消息根据内容触发函数计算(FC)函数,执行针对MongoDB的增、删、改操作。
|
21天前
|
存储 关系型数据库 数据库
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
迎峰而上:汇联易依托阿里云RDS通用云盘,加速业务智能化升级
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
|
26天前
|
弹性计算 关系型数据库 MySQL
阿里云MySQL云数据库优惠价格、购买和使用教程分享!
阿里云数据库使用流程包括购买和管理。首先,选购支持MySQL、SQL Server、PostgreSQL等的RDS实例,如选择2核2GB的MySQL,设定地域和可用区。购买后,等待实例创建。接着,创建数据库和账号,设置DB名称、字符集及账号权限。最后,通过DMS登录数据库,填写账号和密码。若ECS在同一地域和VPC内,可内网连接,记得将ECS IP加入白名单。
419 2
|
27天前
|
SQL 关系型数据库 MySQL
阿里云mysql数据库价格购买和使用教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,通过选择配置、地域和可用区完成购买。创建数据库和账号,分配权限。使用DMS登录数据库,进行管理操作。确保ECS与RDS在同一地域的VPC内,配置白名单实现内网连接。详细步骤见官方文档。
627 1

热门文章

最新文章