Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lO1Hy-000869-TK for pgsql-hackers@arkaria.postgresql.org; Sun, 21 Mar 2021 16:50:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lO1Hx-00058e-JS for pgsql-hackers@arkaria.postgresql.org; Sun, 21 Mar 2021 16:50:53 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lO1Hx-00058W-7w for pgsql-hackers@lists.postgresql.org; Sun, 21 Mar 2021 16:50:53 +0000 Received: from mail-qk1-x733.google.com ([2607:f8b0:4864:20::733]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1lO1Ht-0003gV-U0 for pgsql-hackers@postgresql.org; Sun, 21 Mar 2021 16:50:52 +0000 Received: by mail-qk1-x733.google.com with SMTP id y18so8267463qky.11 for ; Sun, 21 Mar 2021 09:50:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wi3ck-info.20150623.gappssmtp.com; s=20150623; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=ZnKxk8jfemzGRxC0asQjsTcoledNPkXXPlScJR71LVU=; b=kIDPuyuRNYW85+xefdJO2eVFNPn1MCQ5z1wx1E6QfNPHBG1MJX48rbfAwPFxzJO8Lv uTLodNSnuDAxv/9ZbrLnLPO7c5q3p2DYTTPs90gYqviXCXfQTQyRTmMSzQp13pz4JoKs 4U0PGpeKCKUoZ8PwuOgPGN11/A0V37Uy2CqZ/Wrrz6zTK1KecAZZJzOv0eh45s6elY7z ws5DwqJi1tQi7ILsMbCW7e/fKzoiD6CbJdrdZjUwVJ/4P1jJg/H/uYlMV/CGq8e0dgmM s6onn7IpMsjjmZLU4j9FCCbR6u0l/hGriBFjJxZLa3TcVSE0taV6ZVFVxsCrQEr2jQAV NZ1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=ZnKxk8jfemzGRxC0asQjsTcoledNPkXXPlScJR71LVU=; b=MwHddI9eAFIEDoDDDh3PjFI3oLM/Qqb0wjFgjQLVcnvrxr3+8FcONw+Ehemanwvv00 SDGVx7z1jxuBSAdCTLsHnMgYlMi1zttUXpJBHNo8RZCaX4yzKi6+Ke4+gSEuUIRcJXZN gjV/XmkuDiJcBROWsvnzoa9eRnUsYYb1Pj8L6xiZh8BGS0AkX+NDrTjIC+1Mot5MdmZQ UDt7ehI6aBXS0dj1RINCSagYDBQAF8K+E2F7j0la/3WD9+GkCXgS1BBp9BpiK7oEltWk rUKABEAdJcDp5ONAfvBBteeZFKyPHzdiLN9w9DkwwzplgXOXQP/rO/j7/L9sogEZel4/ zaKg== X-Gm-Message-State: AOAM533a5Y8fMCLsZFsz6Wyjr28PZFlSRxEKfOtqN4MACxvixxiB6vA2 JEhFSMkWcR837f8PKPpJgakRSRTHAln4pw== X-Google-Smtp-Source: ABdhPJyclPRAME/JrvoYpSfJ0KkHWTgRCzPuEwXAOg+pbbUblsS7u5PaRVrOfKXRnvcbwJBrk8kyxA== X-Received: by 2002:a37:88d:: with SMTP id 135mr7380663qki.132.1616345447763; Sun, 21 Mar 2021 09:50:47 -0700 (PDT) Received: from jupiter.onmars.janwieck.no-ip.info (pool-98-114-241-134.phlapa.fios.verizon.net. [98.114.241.134]) by smtp.gmail.com with ESMTPSA id q24sm8801643qki.120.2021.03.21.09.50.46 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 21 Mar 2021 09:50:47 -0700 (PDT) Subject: Fix pg_upgrade to preserve datdba (was: Re: pg_upgrade failing for 200+ million Large Objects) From: Jan Wieck To: Tom Lane , Magnus Hagander Cc: Robins Tharakan , Peter Eisentraut , "pgsql-hackers@postgresql.org" References: <1742698.1615221182@sss.pgh.pa.us> <1743618.1615222719@sss.pgh.pa.us> <4fbf92f2-ec91-f4fa-a259-f0968e34f3d7@wi3ck.info> Message-ID: <0b5d506d-70d2-1506-bbdf-89e6453c0289@wi3ck.info> Date: Sun, 21 Mar 2021 12:50:46 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 In-Reply-To: <4fbf92f2-ec91-f4fa-a259-f0968e34f3d7@wi3ck.info> Content-Type: multipart/mixed; boundary="------------D5C941EC94A28ED26792F499" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------D5C941EC94A28ED26792F499 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 3/20/21 12:39 AM, Jan Wieck wrote: > On the way pg_upgrade also mangles the pg_database.datdba > (all databases are owned by postgres after an upgrade; will submit a > separate patch for that as I consider that a bug by itself). Patch attached. Regards, Jan -- Jan Wieck Principle Database Engineer Amazon Web Services --------------D5C941EC94A28ED26792F499 Content-Type: text/x-patch; charset=UTF-8; name="pg_upgrade-preserve-datdba.v1.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pg_upgrade-preserve-datdba.v1.diff" diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c index 5d9a26c..38f7202 100644 --- a/src/bin/pg_upgrade/info.c +++ b/src/bin/pg_upgrade/info.c @@ -344,6 +344,7 @@ get_db_infos(ClusterInfo *cluster) DbInfo *dbinfos; int i_datname, i_oid, + i_datdba, i_encoding, i_datcollate, i_datctype, @@ -351,9 +352,12 @@ get_db_infos(ClusterInfo *cluster) char query[QUERY_ALLOC]; snprintf(query, sizeof(query), - "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, " + "SELECT d.oid, d.datname, u.rolname, d.encoding, " + "d.datcollate, d.datctype, " "%s AS spclocation " "FROM pg_catalog.pg_database d " + " JOIN pg_catalog.pg_authid u " + " ON d.datdba = u.oid " " LEFT OUTER JOIN pg_catalog.pg_tablespace t " " ON d.dattablespace = t.oid " "WHERE d.datallowconn = true " @@ -367,6 +371,7 @@ get_db_infos(ClusterInfo *cluster) i_oid = PQfnumber(res, "oid"); i_datname = PQfnumber(res, "datname"); + i_datdba = PQfnumber(res, "rolname"); i_encoding = PQfnumber(res, "encoding"); i_datcollate = PQfnumber(res, "datcollate"); i_datctype = PQfnumber(res, "datctype"); @@ -379,6 +384,7 @@ get_db_infos(ClusterInfo *cluster) { dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid)); dbinfos[tupnum].db_name = pg_strdup(PQgetvalue(res, tupnum, i_datname)); + dbinfos[tupnum].db_owner = pg_strdup(PQgetvalue(res, tupnum, i_datdba)); dbinfos[tupnum].db_encoding = atoi(PQgetvalue(res, tupnum, i_encoding)); dbinfos[tupnum].db_collate = pg_strdup(PQgetvalue(res, tupnum, i_datcollate)); dbinfos[tupnum].db_ctype = pg_strdup(PQgetvalue(res, tupnum, i_datctype)); diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c index e23b8ca..8fd9a13 100644 --- a/src/bin/pg_upgrade/pg_upgrade.c +++ b/src/bin/pg_upgrade/pg_upgrade.c @@ -378,18 +378,36 @@ create_new_objects(void) * propagate its database-level properties. */ if (strcmp(old_db->db_name, "postgres") == 0) - create_opts = "--clean --create"; + { + parallel_exec_prog(log_file_name, + NULL, + "\"%s/pg_restore\" %s --exit-on-error " + "--verbose --clean --create " + "--dbname template1 \"%s\"", + new_cluster.bindir, + cluster_conn_opts(&new_cluster), + sql_file_name); + } else - create_opts = "--create"; - - parallel_exec_prog(log_file_name, - NULL, - "\"%s/pg_restore\" %s %s --exit-on-error --verbose " - "--dbname template1 \"%s\"", - new_cluster.bindir, - cluster_conn_opts(&new_cluster), - create_opts, - sql_file_name); + { + exec_prog(log_file_name, NULL, true, true, + "\"%s/createdb\" -O \"%s\" %s \"%s\"", + new_cluster.bindir, + old_db->db_owner, + cluster_conn_opts(&new_cluster), + old_db->db_name); + parallel_exec_prog(log_file_name, + NULL, + "\"%s/pg_restore\" %s --exit-on-error " + "--verbose " + "--dbname \"%s\" \"%s\"", + new_cluster.bindir, + cluster_conn_opts(&new_cluster), + old_db->db_name, + sql_file_name); + } + + } /* reap all children */ diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index 919a784..a3cda97 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -177,6 +177,7 @@ typedef struct { Oid db_oid; /* oid of the database */ char *db_name; /* database name */ + char *db_owner; /* database owner */ char db_tablespace[MAXPGPATH]; /* database default tablespace * path */ char *db_collate; --------------D5C941EC94A28ED26792F499--