Exemplo n.º 1
0
        /// <summary>
        /// Creates availability group using Smo
        /// </summary>
        /// <param name="agName">Availability group name.</param>
        /// <param name="dbNames">Datbases to be part of the AG.</param>
        /// <param name="replicas">replicas to be part of the AG.</param>
        /// <param name="server">smo server.</param>
        public static AvailabilityGroup CreateAG(string agName, IEnumerable <string> dbNames, IEnumerable <Smo.Server> replicas, Smo.Server server)
        {
            if (!AGHelper.IsAGExist(agName, server))
            {
                AvailabilityGroup ag = new AvailabilityGroup(server, agName);
                foreach (string dbName in dbNames)
                {
                    ag.AvailabilityDatabases.Add(new AvailabilityDatabase(ag, dbName));
                }

                foreach (Smo.Server replica in replicas)
                {
                    AvailabilityReplica ar = new AvailabilityReplica(ag, replica.Name);
                    ar.EndpointUrl      = ARHelper.GetHadrEndpointUrl(replica);
                    ar.AvailabilityMode = AvailabilityReplicaAvailabilityMode.AsynchronousCommit;
                    ar.FailoverMode     = AvailabilityReplicaFailoverMode.Manual;
                    ag.AvailabilityReplicas.Add(ar);
                }
                ag.Create();
                return(ag);
            }
            else
            {
                throw new Exception(string.Format("The requested availability Group {0} already exist in the given server {1}", agName, server.Name));
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets endpoint url for a given server. If endpoint doesn't exist, it will be created.
        /// </summary>
        /// <param name="server">SMO server for which endpoint url needs to be retrieved.</param>
        /// <returns>Endpoinurl in string format.</returns>
        public static string GetHadrEndpointUrl(SMO.Server server)
        {
            Endpoint ep = ARHelper.CreateHadrEndpoint(server);

            return(string.Format(@"TCP://{0}:{1}", System.Net.Dns.GetHostEntry(server.ComputerNamePhysicalNetBIOS).HostName.ToString(),
                                 ep.Protocol.Tcp.ListenerPort.ToString()));
        }
Exemplo n.º 3
0
        public static void ModifyFailoverModeOnPrimaryReplica(SMO.AvailabilityReplicaFailoverMode failoverMode, string availabilityGroupName, SMO.Server primaryReplicaServer)
        {
            SMO.AvailabilityReplica primaryReplica = ARHelper.GetPrimaryReplica(availabilityGroupName, primaryReplicaServer);

            primaryReplica.FailoverMode = failoverMode;
            primaryReplica.Alter();
        }
Exemplo n.º 4
0
 public static void ModifyFailoverModeOnSecondaryReplicas(SMO.AvailabilityReplicaFailoverMode failoverMode, string availabilityGroupName, SMO.Server primaryReplicaServer)
 {
     foreach (SMO.AvailabilityReplica secondaryReplica in ARHelper.GetSecondaryReplicas(availabilityGroupName, primaryReplicaServer))
     {
         secondaryReplica.FailoverMode = failoverMode;
         secondaryReplica.Alter();
     }
 }
Exemplo n.º 5
0
        /// <summary>
        /// Deletes endpoint on port 5022 from a given server. Noop if endpoint doesn't exist.
        /// </summary>
        /// <param name="server">SMO server from which endpoint needs to be deleted.</param>
        public static void DeleteHadrEndpoint(SMO.Server server)
        {
            Endpoint ep = ARHelper.GetHadrEndpoint(server);

            if (null != ep)
            {
                ep.Drop();
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// Configure an Availability group. This performs the following steps
        /// <list type="number">
        /// <item>Join the secondary replica to the AG.</item>
        /// <item>Backup the databases from primary replica and restores it in secondary.</item>
        /// <item>Joins the database to primary.</item>
        /// </list>
        /// </summary>
        /// <param name="agName"></param>
        /// <param name="primaryReplica"></param>
        /// <param name="secondaryReplica"></param>
        /// <param name="databases"></param>
        /// <param name="fileShare"></param>
        public static void ConfigureAG(string agName, Smo.Server primaryReplica, Smo.Server secondaryReplica, IEnumerable <Database> databases, string fileShare)
        {
            ARHelper.JoinAG(agName, secondaryReplica);

            foreach (Database db in databases)
            {
                AGDBHelper.BackUpAndRestoreDatabase(fileShare, primaryReplica, secondaryReplica, db.Name);
            }

            foreach (Database db in databases)
            {
                AGDBHelper.JoinAG(db.Name, agName, secondaryReplica);
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// Creates endpoint on port 5022 on a given server. Skips creation if endpoint already exists.
        /// </summary>
        /// <param name="server">SMO server where endpoint needs to be created.</param>
        /// <returns>Newly created or existing endpoint.</returns>
        public static Endpoint CreateHadrEndpoint(SMO.Server server)
        {
            Endpoint ep = ARHelper.GetHadrEndpoint(server);

            if (null == ep)
            {
                ep = new Endpoint(server, hadrEndpointName);
                ep.EndpointType = EndpointType.DatabaseMirroring;
                ep.ProtocolType = ProtocolType.Tcp;
                ep.Payload.DatabaseMirroring.ServerMirroringRole         = ServerMirroringRole.All;
                ep.Payload.DatabaseMirroring.EndpointEncryption          = EndpointEncryption.Required;
                ep.Payload.DatabaseMirroring.EndpointEncryptionAlgorithm = EndpointEncryptionAlgorithm.Aes;
                ep.Create();
                ep.Start();
                if (ep.EndpointState != EndpointState.Started)
                {
                    throw new Exception(string.Format("Endpoint {0} on server {1} failed to start", ep.Name, server.Name));
                }
            }
            return(ep);
        }
Exemplo n.º 8
0
        // When we called this primary and secondary should being create
        public void TestCreateAGWithTwoReplicasWithoutDatabase()
        {
            Smo.Server        primary = replicas[0];
            AvailabilityGroup ag      = new AvailabilityGroup(primary, agName);

            List <Smo.Server> secondaries = replicas.GetRange(1, replicas.Count - 1);

            for (int i = 0; i < replicas.Count; ++i)
            {
                AvailabilityReplica ar = ARHelper.BuildAR(ag, replicas[i].Name, replicaEndpointUrls[i]);
                ag.AvailabilityReplicas.Add(ar);
            }


            try
            {
                Console.WriteLine("Creating availability group '{0}' on server '{1}",
                                  ag.Name, primary.Name);

                ag.Create();
                Thread.Sleep(1000); //Sleep a tick to let AG create take effect

                foreach (Smo.Server srv in secondaries)
                {
                    srv.JoinAvailabilityGroup(agName);
                }
                CreateAGListener();
                // enable autoseeding in secondary
                //secondary.GrantAvailabilityGroupCreateDatabasePrivilege(agName);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine("Failed to create AG {0}", ag.Name);
                AGHelper.DropAG(ag.Name, primary);
            }
        }
Exemplo n.º 9
0
        public void Setup()
        {
            agName = "HadrBenchTest";


            baseDBpath = @"\\zechen-d1\dbshare\";
            dbshare    = @"\\zechen-d1\dbshare\bench\";
            //primaryServerName = @"ze-2016-v1\sql16rtm01";
            //secondaryServerName = @"ze-2016-v2\sql16rtm01";
            // start point of dbCount, lets say 500
            primaryDbsNames = new List <string>();
            primaryDbs      = new List <Database>();

            dbCacheLock = new ReaderWriterLockSlim();

            dbCount = 0;
            // create three replicas

            replicas            = new List <Server>();
            secondaries         = new List <Server>();
            replicaEndpointUrls = new List <string>();
            primaryServerName   = string.Empty;

            Smo.Server srv;
            srv = new Smo.Server(@"ze-bench-01\hadrBenchMark01");
            replicas.Add(srv);
            // primary is important
            primaryServerName = @"ze-bench-01\hadrBenchMark01";
            primary           = srv;
            //report server always point to 01
            reportSrv        = srv;
            reportServerName = primaryServerName;
            reportDBName     = @"FailoverResult";
            string username = "******";
            string password = "******";

            reportConnecionString = string.Format("server={0}; Initial Catalog={1};uid={2}; pwd={3} ", primaryServerName, reportDBName, username, password);


            srv = new Smo.Server(@"ze-bench-02\hadrBenchMark01");
            replicas.Add(srv);
            secondaries.Add(srv);
            srv = new Smo.Server(@"ze-bench-03\hadrBenchMark01");
            replicas.Add(srv);
            secondaries.Add(srv);

            string replicaEndpointUrl = string.Empty;

            foreach (Smo.Server server in replicas)
            {
                replicaEndpointUrl = ARHelper.GetHadrEndpointUrl(server);
                replicaEndpointUrls.Add(replicaEndpointUrl);
            }



            if (!AGHelper.IsAGExist(agName, primary))
            {
                TestCreateAGWithTwoReplicasWithoutDatabase();
            }

            this.notConnectedDBs = new List <string>();


            stopBackup = false;
        }