A question about sequences and backup/restore cycles
I typically design a system with primary keys defined, like this:
CREATE TABLE employee (
employee_key integer DEFAULT nextval('employee_key_serial')
PRIMARY KEY ,
I use scripts to build the database structures and load the data. I am
careful to get the dependencies in the correct order, so that the keys later
structures depend on already exist.
Today I was going over the design for the current project with a friend,
whose expertise i respect. he said that he had issues on a system designed
by an OEM that had dependencies on keys developed from sequences after a
backup/restore cycle,
Will I potentially have these issues? If so, what can I do different to
avoid this being an issue?
--
"They that would give up essential liberty for temporary safety deserve
neither liberty nor safety."
-- Benjamin Franklin
On 10/21/19 5:13 PM, stan wrote:
I typically design a system with primary keys defined, like this:
CREATE TABLE employee (
employee_key integer DEFAULT nextval('employee_key_serial')
PRIMARY KEY ,I use scripts to build the database structures and load the data. I am
careful to get the dependencies in the correct order, so that the keys later
structures depend on already exist.Today I was going over the design for the current project with a friend,
whose expertise i respect. he said that he had issues on a system designed
by an OEM that had dependencies on keys developed from sequences after a
backup/restore cycle,Will I potentially have these issues? If so, what can I do different to
avoid this being an issue?
It is not clear to me what you are doing:
1) Are you using pg_dump/pg_restore to populate a database?
If so it will take care of the dependencies.
2) Are you using a home built method to populate the database?
In that case you take responsibility for dependencies.
--
Adrian Klaver
adrian.klaver@aklaver.com
On 10/22/19 10:48 AM, stan wrote:
Please reply to list also:
Ccing list.
Sorry if my description was not clear.
No, we do not mix test, and production data. Let me try to clarify the
question. Looking at a pg_dump, I see the following:CREATE SEQUENCE public.customer_key_serial
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;Yet, in the same pg_dump file I have:
COPY public.customer (customer_key, cust_no, name, c_type, location,
bill_address_1, bill_address_2, bill_city, bill_state, bill_zip,
bill_country, bill_attention, bill_addressee, ship_address_1,
ship_address_2, ship_addressee, ship_attention, ship_city, ship_state,
ship_zip, office_phone_area_code, office_phone_exchange,
office_phone_number, office_phone_extension, cell_phone_area_code,
cell_phone_exchange, cell_phone_number, ship_phone_area_code,
ship_phone_exchange, ship_phone_number, ship_phone_extension,
fax_phone_area_code, fax_phone_exchange, fax_phone_number, status, modtime)
FROM stdin;
1 12 Made Up Inc. INDUSTRIAL_CONVEYOR \N 101 Nowhere
Ave. \N LaGrange GA 00000 \N \N \N
\N \N \N \N \N \N 00000 \N \N \N
\N \N \N \N \N \N \N \N \N
\N \N ACTIVE 2019-09-30 23:55:04.594203+00
2 5 Jimmys Favorite Customer. PLASTICS \N
56 Somewhere St. \N No Such City SC 00000 \N
\N \N \N \N \N \N \N \N 00000
\N \N \N \N \N \N \N \N \N
\N \N \N \N \N ACTIVE 2019-09-30
23:55:04.636827+00So it appears to me the customer table is going to get (correctly) populated
with the originally generated keys, yet the sequence will want to return a 1
the next time it is called, when a new customer gets inserted.Am I missing something here?
Yes something like this, in dump file, for non-serial sequence:
CREATE SEQUENCE public.plant1_p_item_no_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
SELECT pg_catalog.setval('public.plant1_p_item_no_seq', 5509, true);
or for serial sequence:
CREATE SEQUENCE public.avail_headers_line_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE ONLY public.avail_headers ALTER COLUMN line_id SET DEFAULT
nextval('public.avail_headers_line_id_seq'::regclass);
SELECT pg_catalog.setval('public.avail_headers_line_id_seq', 53, true);
If you want to see how things are run on a higher level do something like:
pg_dump -Fc -d some_db -f db.out
pg_restore -l db_out > db_toc.txt
-l on pg_restore creates a TOC(table of contents) showing the ordering
of the schema recreation.
--
Adrian Klaver
adrian.klaver@aklaver.com
Import Notes
Reply to msg id not found: 20191022174827.GB1406@panix.com
On Tue, Oct 22, 2019 at 12:48:41PM -0700, Adrian Klaver wrote:
On 10/22/19 10:48 AM, stan wrote:
Please reply to list also:
Ccing list.Sorry if my description was not clear.
No, we do not mix test, and production data. Let me try to clarify the
question. Looking at a pg_dump, I see the following:CREATE SEQUENCE public.customer_key_serial
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;Yet, in the same pg_dump file I have:
COPY public.customer (customer_key, cust_no, name, c_type, location,
bill_address_1, bill_address_2, bill_city, bill_state, bill_zip,
bill_country, bill_attention, bill_addressee, ship_address_1,
ship_address_2, ship_addressee, ship_attention, ship_city, ship_state,
ship_zip, office_phone_area_code, office_phone_exchange,
office_phone_number, office_phone_extension, cell_phone_area_code,
cell_phone_exchange, cell_phone_number, ship_phone_area_code,
ship_phone_exchange, ship_phone_number, ship_phone_extension,
fax_phone_area_code, fax_phone_exchange, fax_phone_number, status, modtime)
FROM stdin;
1 12 Made Up Inc. INDUSTRIAL_CONVEYOR \N 101 Nowhere
Ave. \N LaGrange GA 00000 \N \N \N
\N \N \N \N \N \N 00000 \N \N \N
\N \N \N \N \N \N \N \N \N
\N \N ACTIVE 2019-09-30 23:55:04.594203+00
2 5 Jimmys Favorite Customer. PLASTICS \N
56 Somewhere St. \N No Such City SC 00000 \N
\N \N \N \N \N \N \N \N 00000
\N \N \N \N \N \N \N \N \N
\N \N \N \N \N ACTIVE 2019-09-30
23:55:04.636827+00So it appears to me the customer table is going to get (correctly) populated
with the originally generated keys, yet the sequence will want to return a 1
the next time it is called, when a new customer gets inserted.Am I missing something here?
Yes something like this, in dump file, for non-serial sequence:
CREATE SEQUENCE public.plant1_p_item_no_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;SELECT pg_catalog.setval('public.plant1_p_item_no_seq', 5509, true);
or for serial sequence:
CREATE SEQUENCE public.avail_headers_line_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;ALTER TABLE ONLY public.avail_headers ALTER COLUMN line_id SET DEFAULT
nextval('public.avail_headers_line_id_seq'::regclass);SELECT pg_catalog.setval('public.avail_headers_line_id_seq', 53, true);
If you want to see how things are run on a higher level do something like:
pg_dump -Fc -d some_db -f db.out
pg_restore -l db_out > db_toc.txt
-l on pg_restore creates a TOC(table of contents) showing the ordering of
the schema recreation.
Oh, excellent.!!
Thanks for the patience to teach me about this.
Does make me wonder what the vendor did to create our issue on their
database.
--
"They that would give up essential liberty for temporary safety deserve
neither liberty nor safety."
-- Benjamin Franklin
On 10/22/19 1:35 PM, stan wrote:
On Tue, Oct 22, 2019 at 12:48:41PM -0700, Adrian Klaver wrote:
On 10/22/19 10:48 AM, stan wrote:
Please reply to list also:
Ccing list.Sorry if my description was not clear.
No, we do not mix test, and production data. Let me try to clarify the
question. Looking at a pg_dump, I see the following:CREATE SEQUENCE public.customer_key_serial
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;Yet, in the same pg_dump file I have:
COPY public.customer (customer_key, cust_no, name, c_type, location,
bill_address_1, bill_address_2, bill_city, bill_state, bill_zip,
bill_country, bill_attention, bill_addressee, ship_address_1,
ship_address_2, ship_addressee, ship_attention, ship_city, ship_state,
ship_zip, office_phone_area_code, office_phone_exchange,
office_phone_number, office_phone_extension, cell_phone_area_code,
cell_phone_exchange, cell_phone_number, ship_phone_area_code,
ship_phone_exchange, ship_phone_number, ship_phone_extension,
fax_phone_area_code, fax_phone_exchange, fax_phone_number, status, modtime)
FROM stdin;
1 12 Made Up Inc. INDUSTRIAL_CONVEYOR \N 101 Nowhere
Ave. \N LaGrange GA 00000 \N \N \N
\N \N \N \N \N \N 00000 \N \N \N
\N \N \N \N \N \N \N \N \N
\N \N ACTIVE 2019-09-30 23:55:04.594203+00
2 5 Jimmys Favorite Customer. PLASTICS \N
56 Somewhere St. \N No Such City SC 00000 \N
\N \N \N \N \N \N \N \N 00000
\N \N \N \N \N \N \N \N \N
\N \N \N \N \N ACTIVE 2019-09-30
23:55:04.636827+00So it appears to me the customer table is going to get (correctly) populated
with the originally generated keys, yet the sequence will want to return a 1
the next time it is called, when a new customer gets inserted.Am I missing something here?
Yes something like this, in dump file, for non-serial sequence:
CREATE SEQUENCE public.plant1_p_item_no_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;SELECT pg_catalog.setval('public.plant1_p_item_no_seq', 5509, true);
or for serial sequence:
CREATE SEQUENCE public.avail_headers_line_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;ALTER TABLE ONLY public.avail_headers ALTER COLUMN line_id SET DEFAULT
nextval('public.avail_headers_line_id_seq'::regclass);SELECT pg_catalog.setval('public.avail_headers_line_id_seq', 53, true);
If you want to see how things are run on a higher level do something like:
pg_dump -Fc -d some_db -f db.out
pg_restore -l db_out > db_toc.txt
-l on pg_restore creates a TOC(table of contents) showing the ordering of
the schema recreation.Oh, excellent.!!
Thanks for the patience to teach me about this.
Does make me wonder what the vendor did to create our issue on their
database.
I thought it was your database you where concerned about?
In any case tracking down the issue would require more information then
has been provided. Like I said previously I would start with automated
scripts that did not get the memo about the database changing under them.
--
Adrian Klaver
adrian.klaver@aklaver.com
Oh it is the one we are working on.
One of my team members brought up this issue from a job where we worked on
a vendor designed one.
I am convince we do not have an issue now.
Thanks for your expertise.
On Tue, Oct 22, 2019 at 4:42 PM Adrian Klaver <adrian.klaver@aklaver.com>
wrote:
On 10/22/19 1:35 PM, stan wrote:
On Tue, Oct 22, 2019 at 12:48:41PM -0700, Adrian Klaver wrote:
On 10/22/19 10:48 AM, stan wrote:
Please reply to list also:
Ccing list.Sorry if my description was not clear.
No, we do not mix test, and production data. Let me try to clarify the
question. Looking at a pg_dump, I see the following:CREATE SEQUENCE public.customer_key_serial
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;Yet, in the same pg_dump file I have:
COPY public.customer (customer_key, cust_no, name, c_type, location,
bill_address_1, bill_address_2, bill_city, bill_state, bill_zip,
bill_country, bill_attention, bill_addressee, ship_address_1,
ship_address_2, ship_addressee, ship_attention, ship_city, ship_state,
ship_zip, office_phone_area_code, office_phone_exchange,
office_phone_number, office_phone_extension, cell_phone_area_code,
cell_phone_exchange, cell_phone_number, ship_phone_area_code,
ship_phone_exchange, ship_phone_number, ship_phone_extension,
fax_phone_area_code, fax_phone_exchange, fax_phone_number, status,modtime)
FROM stdin;
1 12 Made Up Inc. INDUSTRIAL_CONVEYOR \N 101Nowhere
Ave. \N LaGrange GA 00000 \N \N \N
\N \N \N \N \N \N 00000 \N \N\N
\N \N \N \N \N \N \N \N \N
\N \N ACTIVE 2019-09-30 23:55:04.594203+00
2 5 Jimmys Favorite Customer. PLASTICS \N
56 Somewhere St. \N No Such City SC 00000 \N
\N \N \N \N \N \N \N \N00000
\N \N \N \N \N \N \N \N \N
\N \N \N \N \N ACTIVE 2019-09-30
23:55:04.636827+00So it appears to me the customer table is going to get (correctly)
populated
with the originally generated keys, yet the sequence will want to
return a 1
the next time it is called, when a new customer gets inserted.
Am I missing something here?
Yes something like this, in dump file, for non-serial sequence:
CREATE SEQUENCE public.plant1_p_item_no_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;SELECT pg_catalog.setval('public.plant1_p_item_no_seq', 5509, true);
or for serial sequence:
CREATE SEQUENCE public.avail_headers_line_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;ALTER TABLE ONLY public.avail_headers ALTER COLUMN line_id SET DEFAULT
nextval('public.avail_headers_line_id_seq'::regclass);SELECT pg_catalog.setval('public.avail_headers_line_id_seq', 53, true);
If you want to see how things are run on a higher level do something
like:
pg_dump -Fc -d some_db -f db.out
pg_restore -l db_out > db_toc.txt
-l on pg_restore creates a TOC(table of contents) showing the ordering
of
the schema recreation.
Oh, excellent. !!
Thanks for the patience to teach me about this.
Does make me wonder what the vendor did to create our issue on their
database.I thought it was your database you where concerned about?
In any case tracking down the issue would require more information then
has been provided. Like I said previously I would start with automated
scripts that did not get the memo about the database changing under them.--
Adrian Klaver
adrian.klaver@aklaver.com
--
UNIX is basically a simple operating system, but you have to be a genius to
understand the simplicity.
Dennis Ritchie <https://www.brainyquote.com/authors/dennis-ritchie-quotes>