mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-25 15:19:58 +00:00
I used this while investigating a production issue, and seems like it could come handy in the future, too.
63 lines
1.5 KiB
Python
Executable File
63 lines
1.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# Script to download the basebackup from a pageserver to a tar file.
|
|
#
|
|
# This can be useful in disaster recovery.
|
|
#
|
|
import argparse
|
|
|
|
import psycopg2
|
|
from psycopg2.extensions import connection as PgConnection
|
|
|
|
|
|
def main(args: argparse.Namespace):
|
|
pageserver_connstr = args.pageserver_connstr
|
|
tenant_id = args.tenant
|
|
timeline_id = args.timeline
|
|
lsn = args.lsn
|
|
output_path = args.output_path
|
|
|
|
psconn: PgConnection = psycopg2.connect(pageserver_connstr)
|
|
psconn.autocommit = True
|
|
|
|
output = open(output_path, "wb")
|
|
|
|
with psconn.cursor() as pscur:
|
|
pscur.copy_expert(f"basebackup {tenant_id} {timeline_id} {lsn}", output)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
"--tenant-id",
|
|
dest="tenant",
|
|
required=True,
|
|
help="Id of the tenant",
|
|
)
|
|
parser.add_argument(
|
|
"--timeline-id",
|
|
dest="timeline",
|
|
required=True,
|
|
help="Id of the timeline",
|
|
)
|
|
parser.add_argument(
|
|
"--lsn",
|
|
dest="lsn",
|
|
required=True,
|
|
help="LSN to take the basebackup at",
|
|
)
|
|
parser.add_argument(
|
|
"--pageserver-connstr",
|
|
dest="pageserver_connstr",
|
|
required=True,
|
|
help="libpq connection string of the pageserver",
|
|
)
|
|
parser.add_argument(
|
|
"--output",
|
|
dest="output_path",
|
|
required=True,
|
|
help="output path to write the basebackup to",
|
|
)
|
|
args = parser.parse_args()
|
|
main(args)
|