Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sPyFb-007CIH-6E for pgsql-admin@arkaria.postgresql.org; Sat, 06 Jul 2024 05:46:23 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sPyFZ-000So7-2l for pgsql-admin@arkaria.postgresql.org; Sat, 06 Jul 2024 05:46:21 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sPyFY-000Snz-JL for pgsql-admin@lists.postgresql.org; Sat, 06 Jul 2024 05:46:21 +0000 Received: from mail-lf1-x133.google.com ([2a00:1450:4864:20::133]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sPyFW-000fgW-Nw for pgsql-admin@postgresql.org; Sat, 06 Jul 2024 05:46:20 +0000 Received: by mail-lf1-x133.google.com with SMTP id 2adb3069b0e04-52e9c6b5a62so2394355e87.0 for ; Fri, 05 Jul 2024 22:46:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec-at.20230601.gappssmtp.com; s=20230601; t=1720244777; x=1720849577; darn=postgresql.org; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:to:from:subject:message-id:from:to:cc :subject:date:message-id:reply-to; bh=g68LORpoaXz6LDcYuBIVSmbsOP/CpxgmCwcLTsfi+qY=; b=0KYGdDdKun9KNSf3N9MlLPU/k+AUmYvGEmlibfKLisJeWrIYsh0ejsnUfOPiXrZN9h Ch2R2DW+IqG61rTiYPFYfrLwddzOy1qQLXFZ3BpR1r5/nwSl8gtjVYQ23NXVIAGhI3Wx H8NeE9w8J2UezM8ZGsoUR0DtTnyLVl+Qz4pXS8WYaUAQ8Q1nbl04TW6BS8x5qZvscfaG Fqa9Fdmihf0OGiYlPlswczmryTuzFXqCDvsps8fChSqWk4AZcGwNirzeeKS+QZlkrWQj jL7/U5jjB0Ncb1ndSUtJ+FO1PrniaeV6iDqeebYKrxxZXPP7x6gNjcB6BlFZu+/xTowP fbuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720244777; x=1720849577; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:to:from:subject:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=g68LORpoaXz6LDcYuBIVSmbsOP/CpxgmCwcLTsfi+qY=; b=anrMORXhkQyvv3GWhRsGiflmcrnZSuavWM0HLWY3UpP9k/NNXDv2/v0hUDHgYfJvYN lGfwiJd6xaKTGboVGGIe9os11WExZNLxSygyk2LFMvAkHySxXkLGO9dA9QcijIr1lGIu nnbajnTDEvjQ8wVT6tV+bcBBLX6rXnKp+M9XC9ieM7J39OreOgdlysaOF7zJSbXaD+ES 58V61vfI9bnycLfgRTcCFFcSdmgpChMFmSb90i8ouInmexBOp0VjJ5o8qyNIwftR7sC/ BEFq8OfbQ0SW+ZukBJ6AF7a11AOgiUVP7pgGrrts02g00oiFv5K9iWZj8xpfj2NkjjsN uSng== X-Forwarded-Encrypted: i=1; AJvYcCWlEcfrto0zL58ZghnlBU6P7j+S2/IQbKfvIx8zel216yOEVUFaUJV0sUr34QMLa0DaIDyplnEPJlsVG9Ri+tGgBZdtUrYkt3QP4Q== X-Gm-Message-State: AOJu0YwhZ1TH4sUMbPrCuoGEeulxDj/no+qf/Fq/rRfYPoXHUsUOKfR0 Ln+9LmdhyPoheCQKPC1cW4HKUmZdE+nE5/3I8Gk5mBTs6XHFHCpXy55lExkWYas= X-Google-Smtp-Source: AGHT+IGr7+1skDhKfqOk+nnRhPdy5hFgjxU8lEth3UYvOAIqYZkR+HHDDxBAU6Dc7+zY0MFtzih3PA== X-Received: by 2002:a05:6512:3284:b0:52c:c9ce:be8d with SMTP id 2adb3069b0e04-52ea0710c69mr4437046e87.57.1720244776708; Fri, 05 Jul 2024 22:46:16 -0700 (PDT) Received: from localhost.localdomain (62-46-252-52.adsl.highway.telekom.at. [62.46.252.52]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a72ab0b315fsm733471766b.188.2024.07.05.22.46.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 22:46:16 -0700 (PDT) Message-ID: <73cc9d9102a5568834c3473f9cb69099efb46768.camel@cybertec.at> Subject: Re: How to restrict schema size per tenant From: Laurenz Albe To: niraj nandane , pgsql-admin@postgresql.org Date: Sat, 06 Jul 2024 07:46:15 +0200 In-Reply-To: References: Autocrypt: addr=laurenz.albe@cybertec.at; prefer-encrypt=mutual; keydata=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 +AnW5l0HsQcY9ntFL/zEBOaonjdJf Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.50.4 (3.50.4-1.fc39) MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Fri, 2024-07-05 at 17:33 +0200, Laurenz Albe wrote: > On Fri, 2024-07-05 at 20:03 +0530, niraj nandane wrote: > > We are using Postgres schema based tenancy approach for our SaaS applic= ation. > > We create schema per tenant. We have Postgres instance in HA mode. > > We have multiple micro services and each service have its own database. > > For eg. Auth service have auth database, audit have audit. Inside each = database, > > we create schema per tenant. We want to restrict usage to 10GB per tena= nt combined > > across all database. Is there any tool or built in way to monitor this = in Postgres? >=20 > I don't know any. You'll have to run a query like >=20 > SELECT sum(pg_total_relation_size(t.oid)), > s.nspname > FROM pg_class AS t > RIGHT JOIN pg_namespace AS s > ON t.relnamespace =3D s.oid > WHERE NOT s.nspname LIKE ANY (ARRAY['pg\_catalog','pg\_toast%','informati= on\_schema','pg\_temp%']) > GROUP BY s.nspname; Sorry, I forgot to restrict the query to tables. It should be SELECT sum(pg_total_relation_size(t.oid)), s.nspname FROM pg_class AS t RIGHT JOIN pg_namespace AS s ON t.relnamespace =3D s.oid WHERE NOT s.nspname LIKE ANY (ARRAY['pg\_catalog','pg\_toast%','information= \_schema','pg\_temp%']) AND t.relkind =3D 'r' GROUP BY s.nspname; Yours, Laurenz Albe